b780dd6ba5ec82d830e078f393fbad
4aff1ae09f0cc1fb9704c9b716eb51d0f2af43fbbe9dc4e586d875e442cb24ed61faa20b
e843a5e069d5fb6db7de79d9c094d8089af386fbb959f1a5fc479ae228cba3fe63f396f2
84f488fe52fb1aff4ce415d87bf193fec334e068d059ee9fd979c6f49613eca2c6b601ed
93feabc62de7a6c2ff51cba1ff6cf99edb06feaff567fe09f6a020feac27e0afc0ff51f4
34fa62d0b181de78edcc14ffd05affa6f893fe52d21fe498d6be6af3cb8e5fe5a8ff71f8
9bda8a06ffc387ed33dd3ef24efbc09ff9b384d97ae5cd6dfed186ef0fa0cfff4bf7af2e
fd6df7c95ddbae3affbf1fd0aff367b7e806c2df1fd839d502deabed83d093d886f7b0fe
2de50fadfb86f397feaf11ffbf2388d0fb62ff35f2d078d91be086fe7ef76094de7dec3c
bed834c3ed5dd727dc84e06dc7ed66cbf371fd3194e1afcd9ce51ef3c102fe4d9af3bd30
e5b60ac641b7da8bf16cfa32feb247ffb8f232dc4ce0af28febbd96de55aaafa7afe99d1
b002e05dd5ff12f14db8f2af1dff5abfe93390edc561eca5d345afff27f4a1cb7aec5bdf
15c7ff79f96dafff81fa9affb93ab6dc60fa32ed993fcbaa80ceed4dd81ed83be5bb6ae0
aaed47bedf89d8994bffa8f861f042dd0ecef42bfa5bafe586fe75a5fa80ff52c8b3fc3c
a9f79350e59dd9f9860eff4abfff58e4a5caafe08952f179d998e8aaef02ff4eceabdf75
d0e68616c5fb7bd887fcc78342f6b223fdcf08b4c91eef86ff93ed2cafca9dff8b30e096
caa5f97cfbc10193feb71dfb93e080d075e409f894ff87fbaa40d3afed52c0e061cb79ec
a3f60be8afc779ffd96dfade599fff90f984f062caf841fc6bffa528f67afaafd82fc89a
d2b99fff74b6d895c5ff1ff148b9d90fe0bfa5f91896e4d010d8ffc215ba50c2ec89ef76
a1d87aff41f82dfcc3a3fe3af75dff85e47ab6f61293ed239ff8d869b3eb1cee3ea6fad8
79eacb6794f6e060ffb752c534c1f563fa3ed8bffb5cf749df29d863daade53add84c3eb
13ef61fe86d954d72cdc61ed93e5249efb10a5f01cfc58d37eff9f27feb706b4ea2089f7
c503dd5ccb94ff1eafd093da0ae5b859dc11e864fd54f307fe66bfed47fb12ed88d96acc
ff7bf3963ae585cfff498afba33f86ddf57ffe43de13d4f926f292d894d879dd10c0e077
d025d844caea7bc8fb5fffc138adfe39c2ff7ccde7129dff2ea1ffd951a4d87de496d9fe
6fb7d893e78118da86c1ed71ffb5f244ff5cf39dff497bfeb7d923eaaffe71f5afcf03fa
5bffd87acdfe4dd894e024d950cbf36ad6ef61c0ffd93ba7f297fe2bdc6fe079ec30c2f4
7dfecb6fffc493bfe080d88ee024d5af84e0b84cb4fb9b29e058caff6af25ba2edbf61ed
b5fbae37d8a4cbadfeaf5fcb6de60bef5bff96fa55a9fb91f395fea42cff4aafd881de94
ed79d955abe05c93f3b860d4f08718c1fb31f314fb499eee0dff27acfbc2a5ff04afd894
119ee0c0a5cc0cd8afdc9351a6fb9a36c3e89b4bffa1c8b98842f5b668e57df96cfe88e5
86bee24696fba54d7afdd672d07aedb9f64dffb6fa9e55d738aee09c45f218a5ff38f65a
fa79ffc339fea2f20be8c0a9fb13b0d822e0b902ffd82adb62e997ff23f15185ed9afebe
4ffb73c920e486d9bf18e166d861edbcd89de509f24eff07bff189f703febd4bd8f9bf3d
e4b6ed6bdd90d0a7bfe07bd886c8ed5fe142d09ffe35f6b8fe8421fa69f686fd29fac8f1
43beff8e19bfed6de43bd9f1add02ceda4c736cba9f23cfe12a1ffc728d8f3cab612ff36
daa70a9cd8931686dfafff87fa20eeb97ffbc366eda9cb97e505f0af6bd886dd7afe62d6
a0f57dfe88f9cd79aff794fe08c66de588fbc83ad91bddabc79eebb563f535ff86c2ff0e
f8c1841bfd5af9af88d2a5fa28d09add69d2ff880e85fec55893ffaf4cfe24f73cfe4cf7
a538ff93f86ae07cd488e346cfed88e0bf4cc3e2a30285d6e563e0cbfb31d893fe8215fb
6effc007feafee0cc2dc79b9f25290e69418f96deda2e552feb6fa32f2c8fe40ef05ea96
d26dffc852e69ad111fe44acd963ccf92bff52ce39f087ea40d050dd359cee1dc54aca84
f6d358db06b7ff86f67afd26ff48f3ce7be0a5ed3eb0dc943fc7ecb5dc71cbed3be560b4
ff45affb2699edb1f29e23fad601e0c195ec88ceafe479ddb2cf0bafed26f356d96ffbaf
5bff38aeed9257f4b6ff9410f7b04886b6fd0eb1eaa7c1e05194f279dd7fff9354fbd080
d8fa3ffeac45e0c264aff287d679e4b06cb7d393bdcb52e5ac0ae1b227fe60e493bfff7b
f31cb5e698bbfa91c419b6fb94ed7ac8fe6cb7ff92f2b73ba5fb93f579d4af5ae093d786
d8a502fec024d0a0f156fbaef38932a3ff17b7fb96c0dd6cebc685f0cb37da4ed0e57db9
f564fa38ca53f2049cff1bf262fbcb88dc85ff17f2c308bbd299f811ffcc72df46edacce
79ffc5f15ec9f84cdc349bf8d549d828ec47bfe0a533ed09b2ce61dfff9b28fbcf1bdd46
fec259f623ff5ff779fe3bf3c179f8be82f2c24fec27d79dfb77c144ee05dcfe9fd965e0
0bffb554e5d65fdd22d8ffc21bd04ee72bedba08f252f73bffc45e95f879fe88d424e05b
feb9f253e47ac951ff0ef8a51ee077b6ff70fbbc62ff42a1d97ee6acff9fc1d957d68ae0
bb50ff60cda5e9b486d9fb2bde6dd8af30fe97c75cfe35edb50593e09e76f28affc81bac
ff86fac49ff718ff88beff72f6b78308bef1935bff80eda507e07bdb9fe218ddb7d96afb
af4dedd834a5fb88dc5be940d8ff92d0b47f4af229ffc189d42ff5a50cf8affb8052ea86
febba0ff6df9cf6be0afdd69ecb7d94de50ada63ff96cd04da80d893fe2aee87d883cdfe
5dfa15c1ec930af095c3ed1effbe11d35efb87f574fd2d98e41bb6fc40c652fe6496ef7d
fd47f3a5d020e784d599d957fed82effcf1fe15687eecc6ad9a561e66ed9afe95cd8ae2e
edd2f3d850c9ea94d830cbff88fbbf4bc3fc8f2fa0ec26cfff0594ffce1ff46eff86c9af
13f257fdd8adc1e0aa38fa9ee774caed86439ae0bf9ef134e360c4dc369fffc5189bfa8f
13ffc680fb72eb86d977ed60ff27f46bd89edf62ed36abd98de2a03fc4e0af2efe5bd8a5
50f993e526dd3aeda5c3fe6df6c87eee8ef423e6bf3dcb9ee168dd79fba7f317fb6df2c0
62e752a4fbafd8faa03de501ffb823fe953bc1f922fec35a9e388dfeaf0dfb61f79d50ed
2a93f3a562edb1ff7dd85ba7ddc15186e3afd201beed73dd93e09e1cff5287f780d85bbb
fb3e99ffb8f312fc45afd87efd1795fbbf4893fec132f1bfa53eddadcb45f616feb1d1a4
c6b0e14cf514fe9fbff128ff56f3afff6dfbd07ce086f1cb6dd87aff68b6cc06e74bd3af
38de0ed89fd783f9a8ff1bb6ff07edc041d887cbbb2a9afa86beed7e48bc0dc0fe86f158
d2f279c5fb669ce27cefaaffb9e52bdd86c3e077d9bfa9c5e703fed047d910b6fe92f572
faaff29c3ffca2f837fe50f732beed84eecd04ebafff1ad0ace028d861ddc593ff03f3a5
c1f074e5afed74e4b45adafb87f529fea5bfe09938fb49f10a9aff7cb7c752ff80cc97d6
6bd820dc48a5f608fb36aafe17f19fc0f879ff94bcf07bff9afa72ff5ee404d85ef1c782
d99460ff9ff844ffaced1ed0ff0ac4dbff84e95ed095dd9342b4e305f1cd43d80edc67d3
55f999ff3ca4fe15fa43ff6dd886bcfa77f6cc3be41ae03fd80cffbe5ae081d98dd77dca
fb61d83abcfe9443c4ef6bfe7cf290fea765ed79b6cd5be04bd80efe2dd952f4d0841ed8
9fc889ed3086f9c193e57dfbcc39d7ed6ddc01e54ef70cfd86f881beed78cd9dc0ed87e0
af43eb20d8ac42fb14e05acf88ec26c8a3fe7addaf4df63efbb7c60ab5e07dd874e4af68
b3f6923fd59df436fe17fac5ff69d979afff86f791fb84e8c160abf2bf53ed7ad597e33f
f1209ee0935ff2c096c5fe86e97ad0efb017b6f024fea50ee599ff915ad8fa7ab3dd14d8
4fcb09e0bc2ff9d93dfa93ff85cb8cd897ff059fffaff050e60eafffcf56ed1bafdd5ca9
f29321fba5f688d379e0b6de3acbff19b5ff5adf20d360ffc493fe5af3c392d0a8fa30db
51b7f244b0ed27fb93d0a7cb26eb93dc5ef011fec440f9d32ae0aafb22afd97ee0be871d
f3abfd29bbeb4ac81df59502eed724de8fcaa5ea1caffa82cbff33c7fea56bff51a9d860
f92693fa86ff5de270deb766f11ed0f5bf23e04bc0f994ff83f75afecf9f6aedb125b7f2
42f564e87abfed45e36cff7ffad9499ddb84ffd032fec774ffb1d05fc0ed31fea74695eb
ac5dc2e53bf386fe7bdb06e051bfdc84e529fe62bff279fed06cffc688d86ee812fe88f3
79fc37ffa3cd5593edbd6bfe88f164bfff6df6ae46ceec9644c6ed76d09effaf3ecfffbc
78fb65ff0df559feca5dddaf53edb602e6d824baee15dd82cae54edbc695c2f443ffc687
e0a5479cff88f3a558e024d69eec931be5bf11fe9fea7adaa5fc1dcafa68ce95c634d3b6
68bff208e54e95ea9e15dd4be687fa1a9dd87ef1b9ff05f493fb6bd999cf4bf29ff783fb
af0fff6fd99be00294e7a40be59c1ff74dffa5e068d85ae29dd2bd70e6affb17a1e24dd8
03cbe54ad80fed9efe63b8e58f50fe12e556d9fab5874bed94cca8e06ed9ba79ff0df29f
d286f04c9df3ce79fba3ff33bffea53bfb06a8d89c2ffd79f9b6e764d801fec88af172da
3ac7fa79ffcc5fdd3fff0ad05fe0af28b8fe0cf9a1f321fcde79fea2c0fb65bdf089f7aa
37d8afff4ee513d964d854dd2eedad0ffba5c837b0d82df29cc1ee53f67fffd840bdfc7d
cdec7fd9b936b6f031ffaf19f54cfa07f286c3ff88f47afbb179ee99fe86dd25c9ff08f7
c1a5dd86f079dc10fed8af18f84ac4fe9226edaacd79fb27ff68cafc8954e2b646b3ed93
0df2c46cbfff78f8d05cd90bd736f27ee4af2cfb54e686ff69b2d84396f6aad56ee586f1
7dffa5ee79d862e079ccac3ab1cb5eed28d8f942ce05c2fe7bf269caa2fe88f683fe9ed1
75ffc462ed6ad9ff77e65dde36b5d519c94faff8ca57df37b8fb0df496fb86cf80ddc193
e082d9bf50e03bd91eb7dd34febb2ec54fb5f8569fd978e035b7fb23bf6aadc537f5d284
e49538c1fc9a4fe1be57e380daa52fc0f809ff97f463b9e079d99fed52e516aaf4b6ff71
fb9fce4aed9bd3b80af4a4e320edacdf8728fbbf9dfe31cf53d83ae59bfe42b6ff6cd8f7
1eff93cbb371afff86e057dd26b6fb36c7b52de0af0dfabc40e9b728fe941bc7a5fe93f5
61ff8efba0ed1f93edadff76afd06ae057da01fa4bfe26b0ff349ffe97ef7ecbff67add0
69fad993e279edd55fff93fa5ecda0ffd8f27de09d56ff21f1afde6bd4f818ff95c2f713
ffafdf5cd97ee01fd3ff59f721fb33db86cbea893f94daae15ffbc86fb60ffa8d036c1fb
5ef307ffc45aee15afdd91f785fdc417c0f2d704efbe81e0a846f60efeda5fee94fba5c0
ed7be379facf61edca86e0b179f9d27cf2adfb49cc0bd886beed27e060d3ff8614c3ee3c
febe2bff9fedb1e376d0ef6acaf321d260fba543c1f212e0a53eff06fbaf28e7c01bc4ed
81e04fb527ff62fbc2a5d888fb04ed3cb5eb62d835afdd7ded79fe9fd067fcaf3cc8ace1
80d56afea253fec9ed2ee5c18df31dd9bf39e56dfe7fb6cb93d16ce6b893c6fb4bea01dd
4aaeec8a4c93dda734fe62d1ea7ae0bf27b6cf18c84bff09d951ed19a3ff9350f125fec1
02a9e542d888ef6cffb6f847ceaf79faa748d8fa9c65d988f2a5cc79c63895f8a453dd86
b8e883d906dfafeb86ff7bf5c29ebed051fe6aa4f29432fe03f778e599d009ed40fe4aca
b682ff86c8a1fe93f24ad81ccb41e419edc07cd9fb884cffb8ed27f3c10385befe62f73b
cbb175ec93c5f24fe010fe48f8af32fe4df386d5a3ffbe94f862ffc6f660ff94c3ed09b6
ff508bd8fe7df999f087d298ff86c0dd3cc6fe80d969e498ff64b8eb15b1e0902ca4e57b
ffc409c0edba50d7fe05e551dd16f95bffd80ec7fe13fb4aa8ff6df75cfc24d35ad828e9
60f282db92cbfc47e4b1d19dc7fec051ebb893cf9fe569f2d051dd2bed09d260fe85fa9b
f590ffa52dec9805c2f29510a5d871deaefa479fd87de055d9ff51f817a5d886edaddc79
edbe7bd9ac26fe66cb5ce122d99e2cb9e315d9529ffa86c9adeda53ce352d82bde5bec38
b5fc7af5b010ce97f34dd932ccf979ffd03ff4c7fc12d83bf297fe3193f27bb2ca7cff86
eb88d8a266eeac7ae593edc21ce086ce93dc9fed92fe84cd16ff40f60bb6d786ff58f43b
a51cfd81fa60f216bfff2facf97bfeba8ce5bda2e038d867d97accf950ffafe638dab6fa
86ff5af193c3e410ffb6fa9606ce9cc0ff32f99f29c3ff1ecef205e5c197ed1bf5b6fe70
d1fb79affa80f4d04be52dfc13f5c275ff86f6b0fd93bfe021d857eaa5fa34aeff8dedaf
22c65295dea65486eda0e371da81d1fb1be341edbd30cdabfe23f6bb41facc5bd93af69f
bff232ff51fa06ca4eb7fb9abaed6de17aed26afe98ddeefcb68d927dda4fa79d789e513
b1cf65fb45f70ec2ff86f103fb5abadd74d37afe5fed45e018bacc2cff60f1a52786eeaf
fe61ed7adf60d0fb945ce066a5ff7ef938afdb933da5ee0ebfed3fc1e023b5ff79d896d6
83dfb301eaa549cc11fa6df395ff7edb62e6c81dd851fc9ef5affe03fab2ffbb4db7fe20
ee53b7cc98ff6bfb9ff448c1e06de8d18927ff85d775ff45a6d88ae07cbeffa5dd35e15c
d2a7c1ff54fbc609d84c72acf492ffb945b4e054fe9bc3ed35e1abcd95ec6db5d64fc7af
e813a3f625f19cce7ffec39efb51e58fcf83dcbee258d879dc26d793efbf4eb7f687fbb9
33dd62d2ff79fabbd986ff9966ffa36bfe87c0f13ff75bff31f2bf5dc3ff7bedaece4ee1
03d046febe6cfb86e57adb39e286d968e032d993f665cba5ff86f65bd4b00ce175d97eb5
ff09aafec0afed04e593c5fe0ff539b4e623f16df482fe20f83a98dba565f985ffc5e510
d85be987fe07eeb929f65bff941dff5abffb21f39fff6292fdcb6ad855e008d9a62aed84
d879fc0bf94dff8efb37f3a3ff5bfb0291ffd80ed845e9c992eaae4eca12ed53e63ac5d9
09f2cd47e803a6e092cc95d87afb9de51dd9a429ff9cc1fb86f0af16f2a5ca09ff93d66b
f22acb81f26de807b3e546d90fabeb2af7c493ff19fa3bc999f252e26096fbaf57ec80d9
9bccf261d994cf0cc7afdf76eccb14f1d08bdb29a34dfe96f71eb0d497ca70df86d86ec8
f083e53ad0af60de33d8f2bf42ff87fa83ff6bf5bc63ff1ff0a5dd74d7b21cc5afc70fb6
e583c4e13ca5f18bff9e51fe0df49efeb586fc7aaff578e55bafdc7cfbc875fe19f04de5
22d48af860fec96bec38afd869de9bd643eab65aee0ffec39effbe1dfb9fc1ff6dfb97c5
fe79df58db43bfed93e586de6cd815f3ce2fddc21df968ff5493fbae4bffa6fa53a1fe95
5effaf36fe59f5ecc96add7abef15df73cffa5fb06e6a444d8adff72d9fe8df7b62086ec
aee433c6afdd3ee5cd94d9b53db8e92fed9ff549fe95f730affe79f4bc5ae417c0f288d0
5ed831e0c527c1e41cfebf98ff29f3be32dd5ad8a5fe85b7ff40afd89345f6bd90ff25f8
3dff87fd78f6d073e0b55ee43fdda5cd45f029d8ad33f24acf9ffe81f9a263d85dfe2df8
9effb67aff6df0a3bbd62ce5c413c0e374da39edc405bfde7ce393c1d97a01a8fb36cfff
2ee07ed9bb4bb6f17bfeaffb0297ed2fbe10ca5ec5fe950acba5ed1e9afb9307f74cfe9c
f77bfe85e066d879e06abedd4bd520ccfe7cb3d92ede73fb84f26af8a0ff80d89337f786
d7b168ff8bfa80dc35c6ed6acaf409edacd010e079d293ebb31fbfdd2b9afbc14bf193f8
73fe83d993dd7eeac291bee622b9ec06c1ff27f2a5cfba4eca37ed9ad340fe5df4af7afe
9ff729fe84d88eff86f330fb4af81cafffb9ee86e6af61c7a5fb12ed93dd5fd035dc62c6
f77accf493ffa5e046d7f979ff67f8d04bedc888d86de013ca52d009ffa5f021cdff7df2
9dfb943ec2fa66ffafed15db98d202dd44ed51c4e0ad4fed17e8a4cf08ec6df3a00ffab6
7adb84ff6ff99ff158d973ccf2a253ffc41693ffae1ab8d20af362ff59f802ff61fa79f3
68cba7e07dd9af02fc77ef87ddac0dfab779e005cbed3ddd63d09ded1bdd46b6d89ec6ac
d299e06dcd5ad80cf29bfe51ccb163fa25ff83f98af2a553e09f4dd83aed88f26cbadf3a
dab279ffb461ff31f3c096ffa6fab7c63ab3fc9343e519d86ae0afdc25e09f4bc0feaa47
ffb779fab8a5ff0cf1c29efeba48f6b788ff54e0aad93bfe4fe629ddc03ac4fb0bfe4988
fac679edabe039d0fe66ed9fc0e523b6c993d9b717dd94ff31fb4ff73aedc194e51efa51
fec269ebc796fd74b6fa90bce95aaffb6bf7cc61ff0cf252ff42fb2df979ff89de1aec85
ffc19fd4afe016d82dd0fc0cffaefa86c517b2fe1d9bf2c110e6c22ae07edba957ee26e5
4691ec86de5edac0a5fe84f708ff5af279d1f48739e1be64ed99cd1edf87d96cfb3bcc68
da7ae5c922d887ff64bfd79cbbfb5d93fea57add9be1c007e5af35fa6ded86bede4fff3b
88d1fc6aed3fd0feaf46b6d88ed894d086ff42afd891d880f2af1aff3aace01ece50ff02
f5c980e4a52bed93e085da88eda2e093ddbf47c2f978da09e03ff5519aeeb6ff61bcd981
e424b8ff9ee552d5fb4b8ffd9453f1acf903fed189d97fd6f41cffa0f804f15fb9cf52ec
93c7a3fd0694d8f76dfbca2bfe58f373fb30d093e085fa11ff40affb60ed30aff206ff66
cdaee51eedbc30f755ffaf68fed885d55af7219bebc5affaa735d8aff75a85ed9ee469f0
16fe58dc76c9f561ff2be548dabf64c3f65aff93ef81d6ae42ff10c1fe7ed85bfe33ca17
bf51fe21abf09e37d893f288ea7dc7fe874899eb933df26bd0ed5ad97aefbf7bceec61d8
fa9e5dcbb78437ff61f6be5ab5d03fc1e97bff2deda6ca67e636cbb0ff24b6ce12acd980
e2abcb4ee779ff1fef97e4be9ded8ad37ff9ce70e093ef15f352d861ffce92d87ceeb925
beff01dd78cdfb8710e260f196ff0c9de0c22af907ff83e5a9f21dfba512e098cca6fe79
f79dee86d76edf27b8fe6dd9be97dd5ae61ff4c09be6aaf3d97acbfe70d1ff63fb4ac91f
fbb804e5c8fb1cdfc1a5fe4694f601fbaf28ffaf06feb623d0ff44d9f0abc3df1293fed9
6bfb964ccc9fd886fb14ffaff986ee5ae579f196ff3ff7c00affa0c1f45dd8b652c82ffe
51d904e7b525fbab43d8b99bff85e7a245f017e041cef559a3f08cffb045c1fe7dd81cdf
86c6fb3aff89cebf52cbba6dc4e064d4ffbf4cfb08bee02ed812dd35fac19ae537b4f260
fb32f7a3ceb278f166ff8404f7a542e911b6e49bbdff9fd86af7b470bef264fb0fc9afe0
79b7cb64de77e198c96be575beed931bfa4c99fcc53195ed0ed9bbf510fa4bb6e09647d8
1ad0a5c3fb42e588ebb46cdd60ed14a9d981fea5f98fc4f26ffec279df86cafe61fa34cb
b602fbc67efa99fe6f96eaca4ad828e5a5dc31edb9feab48e860d9b3ed5dfda5f520ff3f
9eeb8d52a1ed88ec5ca5fb7bffa5e9870cff79f8cd18e08dd8bc69ff3afb12dd47d1db81
e0c097f35dcb1ced53e538aed943ff31a5d88bdb86fa20ffd839fea8f538f24ff69ffe0e
87fbc4a3bfe778efaefa79b0ff8761e4c2a2f161c1ed91ff6ef83186dcbf55d025fe9ef9
93befe3cf202e64ad918ace09f38ff4cf71bbee98ae279f2d76fb5db50d22bd9fb14abfe
93f381ff79f99d4a7bf5c493f38618a0d832d978e386beef04fdc2f826d96dffce44edbf
51caf2aac5dc4e93ffad47fe04ed93bdd89ebffc884dff28fb52afff81fc7adb86fed079
ed95c4e64dff2ded61cdab73edc1119cd88bd9ae36d8afe03bda54ff06d94ae021bee033
d3fe9341ff23affe2edb4ddf9bbeffa40cfe91eec147d22edd65e0a5d093bff184ff45bf
ea83d19bed8640d414fe4b97ed1dff87f491b85ec3e073dd5bc709cd63e5b1d905ed29af
ffb7fb62f297fe47cffa68d0b038d884c4e52091d9af79fc932afb429ff2c062ecc59cb8
d150e57aec2faceee1b0d093f1d931e6a7c60bf3b624fac015fe7ff393e07cb6f351fbb2
6fd9fa4dff1afbc386f85dff7af286cd66ff82cffe5bf3a41fc6dd7ed0e579d886f2c403
e15ad3ed79d960a8f380ff7af7c350ff2cfb54b8d293fa11b5f35bc3ffa7fb9ec7affd68
d8a5ca0dc1f186ff43f61bb5fb9cf4b621ff88fba0c0e451de7bd9b908b6de952bb8ff79
f496ff44aff1bff501e53fc1e07ebffe0ae4b023f558fb7ff709ff60f6c76da013ed3dc2
87b9d045eda4cb6ceb59a5df71d906cd58fed50ee1c42bff87b8cb7bed88e514bfd399ea
21b8fb9db9f2409ed872e8b6fb66f7b850fa0afeb36afb94f62bb2f920ffcc04e0afd61a
95ed7cb2d787fe1ff062ccfe2adbaf09e563ed5add2cb7f33bfba6ff36e59fd591bfe062
d93cd8eec156d038fe65cf0ced3fff8af76ffeaedd3ee0c10ddba5fb804d86ffc6a0fe61
b2eb6fd97dfdd079d92cdd9ecb89d8a521ffd8fa7cb6fe06fa70ff84f72fff85ccff48f9
bf9eedb54095fba466e65aed21e4b03edd61ff8df129cba5e439ed17c9aced01ffc33c90
ed0b9aeabfa5cd3cecc176c6e962c0e0a576fb9843f0bcfe38c0e50dec98de7ad9a457e4
79ed93cdb725ff84f7c881da78e37bd9af06fa57ff2ff87eff934ca5f27edd79f294ff83
d0adeb4ed512ea7df2ab57fb66d416c2fed89749f214d0fa1fd795ed51a1ff87f26cff5a
f23efecc5e934ccdf479d893dd23d860e0afd90e95e59133ff66f6c2dd27bff593da82fe
66f3bf7febaa47affb7af470db93fe68f886d95995febf54c4ff8734ef60ffa123fe499c
ff8c4df5d85bc7ff8f60d9a3f259fdac3ec3f82fffc095fa4cff3cf8d86be0a908ff57ee
28d051edbf93eaa6cb97ed12b8fbc517ffabe723d84ac6f91c9be085f260cb18fe93cdac
f288e09d25edba80e2a24cf05dff27bee70cc7a7ce17e095de79a5f2c7fe9d28e447ee5a
f388fb9c3ffebdd862f4c6ade01588ff7fd844ff04c69fd20cffcf2afdc7e352d90cffbe
48afdd2ee579fad017dea8e05ed4fb8de080d0e585d9be0fc4ed9616e4ad2aecc207fb70
dd81d0ff6bb1e58aed0fd0bb9de075afcf41ed87d3b79ffe88f76bfe3bd21cf24bafd2e5
72dd98cc42befe86e5af5abffc3bffc49efbb886ec1fe44cff3cf7c168fed85fffcb86d9
88cefb69b2f938feb664fa1dc1e40bb638eabfa9ff9fc6aacc14edc55d87f8b31ae14ba0
fad74db6ee9ec9abf941fbbc59abf2940284ffc19fce63fbd77dffb1c944aff574fe37f3
af12cb47f216b8fa39f3a5fc39cafe7ef9cf79fe93b8d819f85fbbed03d64aaafc77f521
c4fe0df395c3fb4af514c0e021d8aeda79fe6cc2fe8745ff31f96df6a256f10ffe9fef77
d9b222da46e061baff9fc894da75e9b30babf328affb05f5ad42c2e27bed86e5c38fbaff
69f97bdd88fb63cf1cf83bffba70fbabdd27cffb86fec35a93f2cb19fd5ce67add6eec99
e04adab6eb9343ed28e0a212f0961ffd9dee2fd891d87ddd9ffeba99fd71afdf79d86add
af52ed1e9edd3ae54eff9fc1e826a1fb7ffecb34d986df66b6e887ff1eafe27edd6ea8ff
955bfba5c89de403f3bfa8d093e004d9c398df65d82fe6c06afa79ffa5f033d05ded05af
fe31d3fb52c5e56cc1e067dd97fe12d850d324ff51ed40afd8
    >
  >>
  /Gray 1 index
  /Default 1 index
% See the beginning of this file regarding the following.
  /Red 1 index
  /Green 1 index
  /Blue 1 index

  /Cyan <<
    /HalftoneType 3
    /Width 167
    /Height 167
    /Thresholds <
7bb6c793d8a0e14ddb04d951e02dcdb901eca3c572efa5fe78b5d86adcfa3ef584d3b938
f308ff45f9ca7ad989de80e593bfda7debc76ae0bc679dea874abeecb83af378ff9accaf
f175d8f36bfcc2a1e5018ebef786ff51ef28d44de122ceb819c974ed86e4ac64ff9bf786
f29f6bf95fdd20ceff4ff5cb82e0ab3fd8b352dd16e5c484e25dd8fb6087ffafd14ac1fe
d8b34db7ffd15cf7a9ff54c3ed3aafe070c7ff7af29cffdd38fe4cfa13b0ff81f77afe93
f95aeea8c94de5accb1cc0e527f2ad10b5cf95e855e58dd8be9be06db6fd3bf759ce0ffe
60b5ff41affe9238f8d05bd8fb9e1189dd93d9c049fb0293deaf0ecf52ed3dcdaefb579f
e06ada93f978ffbf98f757ff93f65cfe3ef9be38df4dcd37ffafd295c0f67ab8dd6eb6fe
11d0f97affc86bf88cff27bffe933dc1e99530eda5e28328f27be58e3cecbf0bcba5fe78
b8ff26f4a445e423d85188ea9dcd7cedd028e0a5cb21dd79d886fb6afe10f468fd5199ff
7dc5fe87ff02c1f92bfe50f128c2ed12d6a7c59fedadc3f421d19fe026d6edab05feb027
efc3fe57fa20a5e487d8ff4af886ffbe95ff60f227e6c31efbb93bb6d89442ed6bd988d8
2ddd9ecf79f1d186fe7fd95ae006fd40afe00ca0fb38c1ed65bee82193ecb64cb7e09f15
edb0ff0dcbf95afd12bce9adfb0ec2fb9e50f366e430d0e580d886dfbfa7fd83effbbf28
f4b63d93fbc042feabbfff0ce636dd96d892d981ebd062e037d84bbcee6099ddafc993fb
64a2ff72f203ff4dfb349ce779f280fba35afbcb7ae590d251a8e07fcffe34f679b6ca99
e344eb18afde81d870ffb37aeda3ff13f3c3a7ff0af16ce5ae14fbb32498e501edb8fb79
efc3a5ff67f1c357e679afff46a8cffe2ed9a5f171f9cd67d879e06abedd76c9ff8a43cc
a4e078cfff86d891fa9f10f151fe14fa5ac9b60163a9e479fec2f15297e970f04789f2af
cf7af75bff27fab809fb9df5afed78d7abff860dea5bcfafe536d097dd90d886e0bf52fb
0ec862e5c14395de31ff78f9cb09efb970dd5eec1cfd2ad5b27bf9d036feb6ee47cef504
d187e360de2fbccb9efb4cffbf5fe6c6ff6dd8a52899d89352ec1fd87cff93c6fc2ed89a
f774b2f279fe08dc43abfc1ff6adfe3f93f19a52d8f479ff22f12fb1e51ced4bbfff94cc
89d995ed32ffd9cfff47d80687d9aff311d19ec2de9b61ffbe1ee9b9dd6093edc256d218
94fb24f23cc3fb94ff1bf252da7afe5cf91ef368ffa6cc93ffb618f5afff65f39fd8399a
ff932ffbc197c6f28fe56efec14e93e09f0c93dd9b5abffa43aefe8cf95ced3bafdb7ad2
f38b49b9f257feb6f435ffcb88fa97e42fdb09b9f27ae502dd4fc0e05ad37affc682eb97
2cd3afff1cdaf7bf03dd5ed9b9fb61c1fe7cb0dc6ddf36ec63d179e052931c9fee93fab9
31ff5db6ff37f91afec72ef1b08745a4f2cf40a5ff84f8cc65debfa4e061d880dd87fea7
ed2bcb84d897d007ed42dc50edd183da21d8ae0cf1b3e54bc4e0ad15ff43b961c2f408ed
a9ff6df3b8fb2cfeaad96feac921d878e080fed01df69606d8fb931de077d983e2a914dd
47d060fa9fed69afd256fb87ff12a8fb93ed9e32dd53caf27de665ccb23a88feb6ed9749
93df9c43c5f703fb5df5b6ff2afbc2afecf8c65add70d0e681cbe463d878ec51a5e05dd4
feb4fa169ffed821e44aa8ff8f53fe77f730ed46d6b60ab9dc94f03bfe59d978fdaff797
37fe6ef986edbf73fb67aff26cf891d29ed8ff37addd63d815d749d860e086f134ffb867
eea0ff03c6b686e554b7ffa53be9c4a5f90bfd4bbff186fe92f2c14abfff27faa0c4d961
efc93dd91acef587fea64efa0ab9ef6efbd7a53681ffb5f809ffade079d59bd8920ba5e5
9e0efe6b3baaf323ff45a7fc1c9bfb93da85ccfb7ef79707e079bfe54a88f195c4e00dca
ed15d99dcba5fe79fa9cf66fff62e5afee85e5c41587e1c0a5e64fc83bfed924beff0ed7
41e052ed04b4ed5ac0fb83f6a4fe7ef7af1ac1e0930dfdbe44caaaf535fe62facb72edc0
86ff5ece93c99eff65d832e00ea5fe81d8b46eed1d94e59f6cf985ffb963e302d9bbd89a
ff47e5a81ff1c5d814ea61d088ef27ff4ff239fec3f97bbfdd8ed8ffcc88d884edc67aed
bd4af209ffb112d93ccaee54d7ff69cafbaf38fe6ef5a57afabf50ff07c2e432d84de01e
cabb119ffb2e97ffbb47ff07cf9cfeb85ca8d0e87dd987fea6f579fb63c6ff9331edba24
c4eb38cdff9863f7aed67cfb88dd77d894dea529d94bfb0faff22eed51d926e9aef373cc
e63ade14eac24effbe37fed024e4b34bfac193ff7f29e06bd880c7ff8652fc8acbabf43e
bfdc93cd7ee0b361d83cf256f67aba14fb60f7a40bdb53ffc988e0c163edbbff70b9fe89
2ff2b604dec192d959ead543a9ed88e059b0f293ff79aff86affd94fc1db5ff3d081ec6c
f21de286ed9335f861edc52ec1da8ae49d1edcadcf78ff6ab1d9875bf2ca4cdf2aeb53f1
18ff4ff20bc7ff82e49ac2dc6ce0affb78f6c05894ffaf5bf786ff7bf6af79d8f25aacf4
c27ce0a42ef256c3fbaef515fe3e9ae0be9fed2dd980fea25bf614fbc025ee86ff96d42b
e070ed9ce02fcbf386e59f1fea3f9ffa934ba5df299be5acd082ed6bfc26bafe1c97ffc5
2afb7bf66cc816b6ecd041e0bf79b0ed74e523a5fb4db6d893c3ff02fbca88dd1894ffa1
20fe45d0fa7bf350e297f204fdbed809a5fe79fa9ad1a5e584cd8ce2a042f3ba5eff31fa
a015c1df9a05fbda20ed93cbb653dd32d4fb0db686de8e41f708feafcf9fee8635bfeb92
cff607fa46c3ff59e61ec2e487d9a455ffa5c917e265feb1fbc53fafff6cb6fe38d8fb7d
f5d425ddb6fb86f6c313f951ff3cd49aed79caafe36de793bfdb23b7fe86fa3093fcaa23
c6fe03fa93c2df7ac8ff32fa4aa1dc79b5fe50f3bc4be3b881eda551e90bfec52dc1e093
42ffafed3ddbb00fff3eb1f730fe69fbafce1bed93d07ad8ff873dfec579b9d563ff07fa
d08bfe9560edc6ff16fbcd97d86fe548dd11d1ff9d5fde79b8db84e26aa5f279b5fb4aff
31edafd26be9b582efc402ab5dfed985eb24d0ae6ab8c751afff5ff106d85bedb17bdd86
b5f84faaff5dfa3fd803f34b9fffd340df9ec2da6bed88f457d8b54bff3ef60ca5e588f1
bc55eb20ceb079d3fb73f7cc11ffbf94d8b658fb9f4df8cc7be077d085e7c293bfdd7ad8
9dd725ee61feac56eabe4393ecd066e5af50f49bc1e19e41ec17c9e39d4493eabe51ff32
f295ff8bfab142c3f221ff4aa6fe25f8bf0ec5e086d896d079fe08f446f9c03393f2dd87
bd0ecc59fa79d9f704fe9ae083d07be66eff35cffe2bc8eb18e1cd0ddd82f186fea5c3e2
5f93efaf55f40aff47d096e06dea9fd2b895edd65ad916c9f784fc67d8ff0999dd32afe6
69d93afe88e577edd5a526f34ffb1fff38f261fe5afb05ed55de91d880caf902feabf323
a4f21affc335fe4884f2be7df3a52cfbb1dc63a5ed88d85ecb1dd653eda5fe7bd86aeccc
63d87ade96ff37f506ed60df89cb9cdc7bffafe54f27f8d895ffa5c0ed43b4e587ee16f9
35fea4c894e165baeda162ffbe79f2afcb20bcd062fc18f7bd05ffd77de5a5befb13affe
31f519fb52bf86fb78ff983fe0a5ee38a7e0be52ff5ec2fb86f1ac25bfff1686fcc786d8
93da9fcb86d91ae0afc785f872ff10e549b4dd69d872cbff81d987efa4d8b8d924fed74b
ffcf79f101fec522f976fe86ed7ade87d804e493fbbf14f19ffd44ee88d26dc9b1ff20f7
51fc24d859d878ffcfb362e548df1595ff70c848b6d88adcaf44f01dabfb8c09fed89557
fb9f53ff9efa47ed8fdd79cbea8738feb828df62eccb87d880e176cdff26afe930d1feb6
0fc48dfa6ef6d084f29a2ae060d2f866caafe75ab8ff14f15bf76dffa4f59644ffbb38cb
b1f295ff86c4f535fcb25ce02fd152e41288fbb067ace570bbe857d878e09abfda0ae0a5
fb24ff6ef75bcb378fffb83bb5d8ad5bfba2fa3ea6d893d983e7adf20bed9ffb1af491f9
71fec431befb99ff2df262fbd883ffcd45e5d29335c2e327d2ed33e077d9b12fb7fe5296
faaecb59f689ffa250f161ffa5d839adf2cc7bddad53f27dfed948e528afec0fd9bfa4ff
0198df4bf392d83bdd9fc6b605ea2dd879ceec68dca3fd297bda3bed20a1e0bf0deda5fb
7cf793ffc133f0db06c5f91c9effb7f44bff3b93f6af42c7b74fe6c1a4edaedf72da94e9
01ffc01aea62c0e57af031ffbf6196fec15286e1c633bfd97fe6a5f21ceb61d0a5c602ad
e55a95f7bd60f2aff780ff86b6c793f610ffa0d93be5d220e06fdc7ad835c6fa21d9af0e
f39ae08b07ff62f893d8af26b8cc95ff69c5f962fe38cbb0ed7efea70cffb365f978fed0
8ae056fe22a5fa12f086e5c2a6f979c0ff4b92fac841bfde04d84aedaf79bfff945ac3e0
8820a2ddc3afe56ccffe79f4d8872fff1afa4ef429fe86f278e4a8cc95ff11fb5ecbb61a
fbc54193dafe4badff9e06f34dd864df93bcfc53f797ff3abfec0ea2fe4add13da68f002
fe5fccb67dec6af3ac6dee9cff11fa99f2b686e47bfbc586fe5bfac09fed1bcf42ffe486
fc04d8bf43ace093f086fb46db2dd0f279cced2fd94babfa7cef8ec1e479c95ed24dfe19
d19ce868c6e66196ff719ffe83e668d4fa4186ecadfe3ff2b4fb870ff150ff2799d9099f
fbafd48fc9b681e5af52c4d950fe31ef5ab7c7a0e46eed79e1aff229c3a0e066edcd93ff
8bfbc13dd90ce07aed72d0fb6dc2e085d87dffa5ca4ce6a5f23bfed826fbc10affb945c4
e8af4bd001ff5acf30ef46afda2be54dc7a5fbbd8cc44fb4f17ffb9dff17d559e273c8ac
fa69bde421a2ff92f2c53adb0cb6f331b8ff9cf8be93f15dfe0bb5fb2ac1ed19c4f059ce
a9ff189ad8f52bdf6bd772d83acffe83d99fc0ee58ffbe55ed69f630fcce10d6fb9925f5
92d886d1f64afe03f799d32fff86e95afa15f6b558e02ddb0fa5f281ff9fcc2fd9af21b5
ff38fa1cedaf2ffc9dd86bc0e4925bcfaf79e1c87ff29364d8ff78edc0a0ebbb96c2e86d
d785fe79eb5fdf07eda0d961e434de88d87bfe27b9ff1199ec4093fbbe51e0179cff86d0
ff62afed3add09eb43ade084cff279affe7fb1e038b6f72694cbfe61b7ce93fa09ff7ff6
a55de8af17f96bdd86f2d00ee09dd85f93fea53ee0c177e265fe2099e086daac44fca5cd
09bb93d788c240fe7ced86c9fe6be4ae4df4befe60f3d686d89bcb79dfc089f324ff961a
f5a7ff4df8b252fb18bffd2fa8d99343f61dff55fb05ffb9ed13dc37fe83f46bff30f7ad
ce79f351ebc19fdc6bf4cf83ffd661edca79fdce5be59e46c4fc88d87ffe93c4ff30d9a9
4fd8e451d1f76cfdc772d8f24cb6ed11ff50c0ed90dd29edc932fcd17eea39cb2b95feaf
42ffc0ee48bff885ffb50cf2bfafec38d862ffc267ec7ad9fff24dffdd95d5b661faaf46
d024fad893108dde9f4ff167f541fe5cf854ceba51c5e072dd05edbe27e6c3a5e054c8f8
1bfecd7ad993df80d8a43e88faafd19fc645d4afe0960dffbe24feb508ed43e5be55df19
b5f707afdd48b5f624fbade502d954edaf5bdc77b6f725ffb703f1a329d9ac0effb57ce1
86c8af7be5a444cc59feb67ce09649ffbc93feb0e05bc7f28707d99ee119d84cedcf9453
f779ffafed15dfb422faae38cbb67f27fb0ef3cd20e094edb8863affcaf733ffc703d990
e49fd909e279eea9fe3ffac194d882fe9a66ff80f39a61e0ab5cfaaf3ab2f26af8b6e098
50f61fffa6fb2188fec75df1a1cb81fa92ffa52ffeaeee74c79efe87f283c0df7ad866fa
73ff2acefb0ff5cb69e2c25ffb7acbff62f48bdb46fb03ff3cf7d328feaff894c705f263
f7adcb02e463f486fa20a2e6b879ff69f37cfba160ffd607ddc02b93f983f4be6de59a19
eed8bfa4e151abff79f65affc5eda55eb6d862affb7aff19d07effb6fb15d886d8af51ff
34f260d1ed38d807d2f086c6e509edc6fe18cf4ded23ffcb86e279d87bcbed489fe686d9
34e058d870ceed935cc2fb4ce538d810e33fa4ff14f196cba5e57ab9e4a940ffb085dd94
e6189be03bcf9fec84d895dd79bef061db1ae56affa4d922dd61fbabc914d973edd44bf5
cb31ddafca28c3e53ba5fd609bfbcb52d83bcffe56ddfd9e44f566c4fb73d8b701d99e17
88e0c520f292e85acca5ed67e09746a3dd60e90cf286cea5c2e411a9f68efeb942fe2da3
ff90509fe57bff93d865b4d949ef0ee75dbaf9d917fb6affa6f61bfbb805d8f93099d97c
f6b9ff6ff9cb6cd9af42ed18c2fe3987ef96d715fe37f46dbefa7cbefe20bcf936f351fc
1e9dd882fb9ebad84cc1fe81f29f3dedba52ffb685fe66a5fb9345ff9bf570bfed80e4c3
46a6ef93ffa207f18c5cc9ff93e62bb2ed39cbfb7ae5b2f246fe86bffd13baf92dc0fc1f
f4b3ff82f97aff9ce31ffb4f93fecb5ae0669fdd7ee7d06edbb6f937dcad2efac20afeb8
85ff9cf5328fb3c851ecba7ac4e6618cffa465d6ff1ceba54795d8a932f386febf79f955
98dfc11ffa71ea93d859cced4eb3ee65e574cba9c593d0afff3df2c252ed1ffb77b0e02d
d0ff80f8a0cd32e513bfe005d0ef5fd910b4fa32d11bf3affe0be279edc779d8e6ab04da
5aff6fc1fe64afef52fe6cd795ec42cba3dd50ec7cafd363ed33ca26d0be3faff488ecbf
4497fa24bfff0ef7a648fb14e96bd886ebbd74f1ac68f3cc3cd886d0ff5ae5a5d009f24a
97d8f23fcaf483b6cd67feb6f023fec15cde1fe0a3d6b1f26bffa5cdb649f87affa92afe
d80cd99afb52ff14ed61dd6ee3b30aff86d399ea0fbfed934fda22e57afbc596ff77f3b8
87e580fecb86dd94fe7bdc87d252d92db5ff347af9c682ed87d911a8de28bfd51dbaf90a
aeff6af674ff98d93cffb993bfe593ef5afcd26edc27fface579d5ed74ce60c2ed86cb98
fe09f75afed240e0c11baee56dfd01bff027fa6bfe86c1ff2aa8e1bc0be54ffab003d979
d587e49dbff658ff33fc07d247ed5bfec19edf0be4c7a078ff88f12ce080da98fe0cf5c4
79de62b6f35ac5ff9066fec1aefb62d8af48ea5ad89f41ff1ed0af2cff56ea61cd37eb6b
fb8afa65c1f3dd419ffe21b8fa9cf577ff7bfb9bdf79cbe487d825d3af05fbc859e00dfe
4efab0e0a201ff5bd77bd905ffaf47b6f494ff23bef33fb9cf9fe11296ff81fb9efe4ced
afda61acd880de3bafed79cbfb5c93ff9bda7ec8f388ff60f509ff4694d987ce93e79fdd
8fd801f231bff19262f6bf43c958d2b1f75ace86d8a534fe92f8cc31fca540f1d807e145
99ee09ff88c1f72cfdc46cbded6de5a5d30df7a0ff82f21dcbafe512a56efbd266e4cb4d
d838e1afce4bf23affa533fa55f17ae6c288acf779f2a5db861781f8be86e99df363f0c3
84fbd82bde51b1e37fff75f048c7afed60cf27dd79d8962ffa88f74fff99c5e321dc9f13
ebc049ef25fe3fa5e42add81d0a6c3fb0eed62d96dfa26fd80e688d9a553ffd01deba8f9
95fe18a5e12ffa49ffbf51e7149cdc7de4be60b7f779ffcb70dfa5f218afe087eda5f850
fbc179f1b666d823debfa5ff4495fecfecbc0cf3b07bff8bf29806ec8fc1da67edc683e0
9cfe38f24ce121d9c43bc6ffb6d937edc940fb1cccaf39e01295fa7dcbfd59d81bddaefb
63ff38b6f893c2f50effc09ed21cedbc11fb8af762febf7af8d06cd886e0bf5cfb51b9ed
66e579cbafff1ef286c65fcc3fff6afac239affe86db05e561c3ff79eeb6e57aeda5caaf
ff4def27d0fb9d3ad9af1dfabd3acf9eff4dcd10d836de9d01ff4ac9fb89f49b56e379d8
ed87269959ffbf3eed1ad94fc9fe61fd10b2f81eafff08ce5fda95ff80fb9f6cfb955df0
8dfe73afd877b5f96bfeb8edc55beca103ee91fac12f93eb83c9e558ed35afe16ff142fe
a5ca6ee0b541b7d832f1af379ffe93f516ff9bcba5f820fe37b5f1479fe051b6ffa5f6bd
9cdd18ed97e556d872ffc188de3dd8a70393d919fb6df184d495fe9317c2f384eda4c754
fe79ed68dc7ef294ff62b9d98ee89e14d947cafd03f7bf39b9f8e0abcf7fdd88fbaef66b
b6d894e679d09add6bd97fedb610b8d533edbf06c2e224d750dd13ffc1e62bd8a24c88ff
af3cffd27ae0649affd11edda802ffbea3fb52d081df8ee756fe85f49eff79dd68d6fbc2
1fed53d08aed0edd83d88cc8ff7dd6fb78c9e739d812e25ac4fd67d979f32defaf3afb9d
f362fec6fb61d05ad82de009d977ebafff51e52bff80f294d928faa8fe45e47ac7f450fa
38c1ff80f8b878ddb064ffd6794af22aeb61e5c3369fe523fa53c2ff4bfb3ef5a6fe45fa
a5ed6adb52ffa8f470fe7df793f2924498ff86f2b4d91fe5be6cb2f433ccf15da5f652fe
8bd069e07cd921fdc107aff21dd351d903eeb2ff0f86e4b074b7e561c0fa6dff40f3ae02
e92ebaed0e95f47dfe93f72fb1ce0ffba3bbcb7ae0b80db3e48f4bbef094ff88f6a8ff5e
f936d87ccf96d86add0fe85dd5b804b6d793fb1ba6e082afe45aeca92fffc225f2a518fb
da94fdaaff1486d8fe75d09ef12ab4ed93e5bc2ac3e086d827fe86e578d843dea5ca32e0
57d0eebb52dd0bfb6af186d8f919c2ffa20fc0d96de3b0d940f716ff95edaf5affc67ddd
87fbade59344a2e9cb40ffc6f72fffad45d0afe166dd9dc1fa619bffcf60dab545b8eb86
ffabc84aff1cf94df588ff27d8f29d1fdd40e5c36abdcba2e35af105fe4bf9afcb88ff85
f69bee2dda5acdff28bbfe79d81fccee6c97e086e6c86ab602c7478dbff8af0ebeff5dac
e061c807cd63ed9e18ff71f3a2cb16f89cffb70efbbe9efdb405face7ae89bcc48fe349e
ed9351e6affe36fb981bf2b787d875cc32f7a4d860fb3cedc32f86fcbdf5619aed920595
d87be096ec1aa1fe2bf65193e0c242affc25f1a5ff78df27db6ee995dd80d9a2ed5acab6
36ffc167fab30ffb40ee1bb8fea5dc86e09e36fcbf21dd4fe187ff85f37494ecd007f190
fe9c5fd8fb3dff4f9cfeeb84e3aff1d35de087ed44cbf97eff88f794ff84fbba5adec153
eaaad02fc666e561ed1cd87fdc9139fec029ffb975c3db61fbcf88f37bdd87cbff70c6fe
59f292dc6be52bec89d9689affc64ee018d8f95ad9c0fe4df30dfd87faca71d982d3fe1d
f286df8dd66dd904d25cf293f709d75efebf21d0aafb7aeb85df9fcd71e085da8fff79ca
47c0f36dc6f15becb679feaf42c3e00dbff659a0e06ad945c6fa0db5ce7ad9f13293ff52
fb2999ff3bfb93d9b703db31d84cd91fd851ccf1ae03fe89f45cfd87f199d884ffad4afe
c4f062a9e07bd9a5ed06e4b525dd43d807ed4aa5e0299fe80afe4cfbc396bfff0cf6c020
f2b879ffb528affb72b5e9a0cdb93abf4ef2afff37b6cd9ffe09f950f59ffa86febf50c3
fe84f2379bfa81e514da53f706fe39f3a5fe51d833e591fa9a2fff0aafd87afaca15d8f9
a368fed631b7fe3ffba5f4b67ce98af6af09b8d243c1d97acbea7adac41bf084fea9f36d
feb5f079e52c93fa85c93fb6d979e01eff3aee52c1f29f1987d6fb58f30ffa5dfec083ff
79fa86ff79bfef62f9c97adda5d2b613f247a6d781eab065de9ccb6bfecf3ce01cc75aff
79f7db93d507a5ed7be556bdcb79e3ba41b3e0329deda63ce08fc9ed48d869fe8ac7a5d4
7fe1b724bbebaefb60d811edafd0a1fe30df469fed9327e6c14997fadb6ecabc1bd436ff
51de2fc5ff87f8ed9f0cf4a521f254a3faab37d157c0e09c3da5fc8fffc347beed94ff0b
f9a5d091bccd87e029d9b6eaa013ca96e080d7af4af13dc7afe045b6fc10d8af39fbbe26
f077fe86c5f831fe4bcefe06fa3aeebe85f58eff93ed2cd8a716ff61fbc74ef813ff82ee
af23ff94ed69cefb1ae5ba63ff12b7fe9ff143baff30eeb44aff95f78801c2f27eff6dd9
66e582ef8bffbd61ffce77fdaeed8813b0f27aff93ed9fd681fb6be25aad28ceff70e4b8
86ffbf4cc3ff89ee9613f7b8dd0bcf60e49ffe2eda71d7b647f55afe04f7aaff65fb40f5
b0ff3abfff27f594cba7ec139ff6d17ee488ff9bd055ff92e55db0e07ad899dd6fa5e486
d8a50dea49d860d77bde65f2c09aedb67add89d862e033fbd986d812ffb679d85af3cc93
de7bd002c6aaf479e57dfbcc72d95cd2ff9e43caa5e243fb1ec757d104f2d83ba6f306d9
4cbdffd82adc62cc84da15eda5d01dc0fee063bedb39fbcd06e799df61d926ffca7be974
f983f110d862e5aefb36e79cbfd894eb8038c1e094d07dd86ae5a552dc67ea1cfe60fbcd
8e22f251d621df6bed7ece34c1ed07fe53f31afbc03cf761ffcf78feb6f202fba5fe37da
4acb1fe53bfea2f5aac78fc147f9a5c830f786ffa42cfb4df66aff86e024db52ca1b9fe6
12eeb532e0afed25bef494b7ff97f7b36993edc75ae07dfbd0579dfc93f302fe5afabe3f
fe99dd79a2fb4893ed9d66d978fc12f67fe5a652fe2fd74ddca5ff7df7c1159ff264ff23
fa43afd8fa890bed50fe22f285f9c884fe9dd986debc4cffc0affe70f5affb03baf79fff
6bd3a5c783e188d994baed2396dda72899e3af44c1e67bfb73ff88efbf22cf4dfe19f2b7
6fe562edafd20ec0e083d9a7e83ded5ffbc099f2affe58fac179fb6cf684ff87cd61eb2a
dd4ce5c0fe2086ffaff13393f5c240e052d873dfb272e58cf249f712d7affe17b9ff4aef
c593bed646fad085edb2ffbe27b6e03b8dffce7ed888e07ac4ff5b9ed4ff7add88e05bcf
18b3e009d253f22d9ded6bda369fe5933fcba5e048da1db1f22effb647f827ff4cc8afe5
39fab8ff6dcbf38810f0a5e059d8a85cff83ed95dc7cffd006fca143e497f040fec215b8
d89eceb40ffe43d981dda54edd9ccf19d851dd0afea5cf7aff9f37d7ace9961ccaabdd0a
e586bfff87f8c02dffc305d8a8c7f07ddd68c9f282e0ae31fe5af491b709e09f1c8ee286
fa55cbf3bc4ae401f34bb3ef1abbe72fb5c835f9b9a2ff96fc6df67bff92cffe01e190ed
c10ac3ff84f365ff94fbcb57d977e9cc6ce0aff266fe7ff18ad953df2098ffd3b927b5f2
03fac49cdd08d652ea37afdd82cbfa67ff6dd0b079ff5bfa2aff76e08bd86aef28bfff0c
f25afe95fa79f0c142fbbb18c3f281fb52d0f965fe75ffafee22a6eb17a0f24faaf980ff
6096ff2ef8ac40cf21fa95d9b51cecc6ff66f5c5fb58ee96d9b11d86edaffea5c0dd6bd0
fb74f554fe9ccd02ed49e43cc7a0e73ad965afd774ff56faa6ec4dd915d8b637be77f693
fa139ffdc2029fde15d856cd11ed84fbc34a83fa95fe80d686eb2faff46bfbbf93f15fff
2899dc08b6f824ef93e581c796f14ef937ffc493e385d693e079e731cbb488e475ef90fa
50d80fde78b7e641d2bd5a89fbd267c7e57aceed64e036d01fb1e586ed9efebe79ed6bd0
ff863aa5d849af37d8af06ff75d9fb9b2cc858f914feac3ecaa5e56cee79ffbf8ad0a9ed
20c5a5fbbb36edb626d97ae068f599fe7ae48ff1d60ee05fbfed4186ffd070fb88f679ff
add05dedafe034db50e53dff54c0fe7be6a51efe46e4a9bff27ac8ec88d855dd34baea0d
d0a8bfeaaf03fb5ff767fd3cc9b9a8f84aff13d93ed39be46dedaffe26c7a4f22bf8d89f
3cfeaf33fe9b1afe86b6eafdc979d901d85be0b00efb3fa0deb3f079fec7f379fece51ec
bf60d3fb8ae094d87ce099ed0cd6b71dafd861fb10f766fe5cf20dcaff79f7c687fe1eb5
c92faeee1cfb4a9cffc2abff79d8f1bd51ebafdb36e0a130fcb80dff8cf5a9cb79ed8ab4
e05dcd2adac49dbccc16e652fba54dfe6dfcc2a5fe74f761ff2186df9cd0b72eebbba4ff
07ed8adb82f3a4b8fe01aeffc14a9eef7aff86de9711c2e081ccf45ed9bf52c3f66a9d44
fa59ff72f333ffd996c1f85efc21e0950fa3dc619cf89339ffb854f124ff4ff228ff86f8
5fffc5f72aeda3d893cbacd893e56195e44fa1ee61ceff79f9d051dda5bfea863bdc23e4
a52f93fb9b26c0ff7fcaf377dba1d84cc609ffb61dc9fb12f293ff80fa69f67ffe89d82e
e0bf1de19f04f352d79edc8ecbf441fe4bf0a5cc14f268d85cfb25bfcd65e07aedcb2c88
f5d85fe00ccd68fcafff4df10da5e27ceda5dd0ad8eeafd095c3e8a4d387bb4ce904da93
cd6af7b6ff26edc017c5e5a80ae672d683cb90d8b843afdd924a94dbb53fff50f327ff4a
affad31accfe11dcad46edb770ffc461fe08cdfb93f85bb9f4ca3fd8f79450e604bee540
fe6bfa93f17ad8f9659fd875d848e40fe034d85ff3a5ff85f7b47beecb71e01ced39fa54
afd97ae089ff53e584dc98e57caffe4cf726ff5786f9d89517fbbca0edb539e47dd993ff
be43ff2af989ff7a2ff517fe3cb61ffe61f5cc7bf1c043ffbe30e55bd77affa5f26dd0f4
86da9ef709fe61f39afb22f2cafe62fb86c2e571e089c5ed2ba6fb86b8e775f389d007e5
af2bf37cd9a264ed7bccfe0889ffa51bedd386fe9b62f286cb23de5ae84196d0f53cffaf
f4a3ce86fd9fda01cb5ad961cfff4ca8fa92ff7fb6d186ff14f5c124d896c1fa3bff1bbc
ed79e587d0a2bfe0a543ffadcb3bfe55f5c263fa22d652ea95c9add146c1e5d874debf90
fbc693e4109fff5fa5e57dddaf83fb93df32d84ffe36a4ff3aec5ae0a7dd12e080d8b784
08e9aedd159dfdaf06fb80c1e051da3c97fb2ed89afc5cdb94bfe33effc017d94595e5d8
4bcefe6cb8ed43d9c418bcea9fb9fba5c0ff24b5ed8805c762ffb64aec79ee93fa22ed99
0fc1de35d864c8fb06e596d8b36dfe61f71eadd98ccbfe44d80fb6fb3df21dfdc767e581
dc93d818e09cbfed86dd6ffb13f27afea16191fea854ed66dd41c2fad82db9fe19f24bfe
c402ef60f986e07fc1e369c793febc65c5fcbf52ff3bf6c69737f5bad931c0dda546ff91
f47dffc459beff25aaed86ff58abf57ee6a6feb7ed60aff269afe22ab0f96fffa4f74dff
38ce13dd62e055c2d9fb93db26f1c296ff42e076d786fbaff579ff9ced4393f2bf4efe34
eea2becf86fe5af362a5de93ffc66ad993d87ab7f304fe61f77bff5dfb32b6fe05f09eda
60e024b9f8d837e0c40bf77effa24b86edcf84d89dd579e191bfd09fed10b6fb20b2fa1b
cf2fed93459eeac2a5d36dffd87f50f994ff6df2b3d816beed04e19fed79c2f841d512ed
cb25d854f23586c5ff2cc4fa0bc5ff7dc0e030d87cd193f082fe93f7affe8432be4af8b0
5ae11eb8d1a5fe3ddf50d829e2bf16affed967a9ed7cb7d308e94ae4b1d00dc0f925f14d
a5f407ff52ed35d0b188ed21cba9d393e75acba5c642afff91c8ed047df35eff9ab8d023
f1b6fba652f76afb20f43cff4efb29adfecb5eedd879e59ff979ffaff1861bfb58e523a4
fec286e151d623e886fe6ca4d866fe17b2de6ad980faa46dfe96dd88d2f911abdd80bde7
8b4ced0ea5f46afb07d95be0c147cd0c9bf1adffd872cafe6df586f910b9f29fff6bf0ac
57f8c5872cd0ff18cbfa79fb92ff9f39fb9ae87bd886ccea7ed587de9ffe70fac451bae5
43f208aff27cff67facf2ee44ca7ffddafd487ea50e5af61e014caec08e094ccbca5d8b7
94c3dc4893f3ac43ffbf6ad9b603d834fed093db88f1cb43ec0eaff47bfe5fce35c3fb3f
f281cbf633feafe951c7e04bec05ff4dbe8fef79ff579ffbd086fdc954ddb6ee86ff2ca7
e97deed25ee41998ed0aa5ddbf2ec4ea6cc31ab7cf81fe93d860ddf79e5be0a43be055d8
29c7ed79dc31ff64fbb230fc47f7af11c0e02fd99bff78fb9ec0fe40d928e0b984f388fb
cc539f12fb34bffa79fec196ff6793ffaf3efe5af10ef65cff79f8d107df96cc11ed3dcd
f37ee3bb4ef506fb51adde89ffcd34ddc199f8a5eb79dfa6d85393e3c0019eff1faef782
b6c99cd9fe41e01dd6f22fa8df3a94ff9841a5e068bdfb6effa528fb93c0fa86d3fc4592
ff9e4bffd993ed3adc03e731ffaf0cc1ef7fffba84f3a5f97cb6ff51ca9fe10bdd98bfe0
6ccef160a5f781f20eb3cc69db84d193f7a51ae557d90f93edfecb8defa50ad82eed47af
e6c75adcc27ce48bd887e01eedaf6cff87f65ffeb1fa5ba5fd60a0e779b7c885fe13ef4a
9cfa9305e34edc1bffc026fab9ff4786fbd079f0c52dd8fb72f415b1cf86fbaf65c1fe7a
f6cc1fedbbfe26c7f201d83ddcb0c739de52e55e9bf2d061e5d38733fa79ff86f4b1c677
ed95fe44d920ecca10d851df05c6a8ed5baff383ff17a5fe3895ffd31be15bc2eb38e424
ed60e079cdfe6cffaabff62dba47e060cdfe86db91d8f936a3f225fab317ff45fb66cebe
32e6c428aadd9f2593e0c117c4ff2bd4ff3aedafd476bfe562b9fcaeff93d16191ed9909
d3afeea952dd9961fea539e05aed69fab850dd9be317d94aafe080d87af69f79e588f86a
ff82f399ff25c3ec18a6fb05a9f7afc0e053d79f5afbd44de086cea5f95e9aff87fb93f4
60f81afdcd41d861edca86ebc14886fcbfa5fb72ff7cf7a9ff12fb4b9eddc338e079d999
f280ff3cb3f24dff1a86cbfd79e066d9c09ee9b9a5f27bfeb85afbd53feab7ff4bf095dc
6dedaf86d99a5ff9a1ff1ed0ee8431c957f5befb4ac3fe79dc2fc9f50dffce7ce4b986ff
9fd829c7f503ff5bf4c493fb61ff14e64cd9ff56caafe016d862d97cb6fe77bfe086c9ed
55dd0ba2f324fec217a7faaf1efd63c7b0e545ed34ce76e086d9be7bff93f6b851d922fb
afee974edd29d892d5b844b6d88ec6f10195f886ff5efd16d0a1ec6ac4df6ed0eeb006d1
9fff2ef251c933ff05d94d93eebf6eff7af285d874fb36f9ba5af61bfecb26d858f3b14b
d8f786eb9f0ed896e535f38aff7093e5ba46f40ffccc23db7aff966aed92d5b068e405d9
a5f293d0b41db8fb2d9ff494fe04f6d833b2f839fe4f96ff7afbcd6bd974e58af33ac0eb
93f12eff86d7be9bfeb62bffac46e81fdf359dfe7be361d809c4ff81f859f307fe98f55b
ed31adfebf49ed1ec571b8e523c1fb039bf8a55aff94f44bafde88fe92dd7ee5acf3c615
9de50ada42cb0ee5bf9fcf08e07addbe6df27ae4c181ffbe11e039ffb869ff7acb5ce01a
d5fb5b9fde88d8a56bf892e952e2d0b348f92bffb3f1b750c634fe5ff3d779edcf45e05a
ccaf6cedd065d97cebc62bd8ae3fffb0ee45b7d982ff58de7bd9ab01f350dc12f2cb65ed
96c4fa70bee802f2c09eff8ce03beda6c99ce862dd26d886fbcc6dde93d1a7eaaffa85fe
7694e1be31c3e524d887c0ed73d00dea62f9c12686fbaffe86d0a5f58cfeaf48ff6bf293
fdab4fe692ffa502de3c9ffbadd175dbf028b6ec9abff8af3ac2f226fe5fefbf4aca0afa
b725fea5c2df9f4385fe90f9bf96e1873effb668fa90bff03bff9f11ffaff419b4e482ec
94c71c93f8cc08e5a0d00efb66f7c493fda5ea6fafd809fe51a0d9ff5bceaf43ed30f562
b8cf13ff46b1d886ff77e59b4df428ff65fb52df39d949c6f65aff86fb79b6f739fe15fb
5ef4aed23897fed54bdd31f15ffc64d82ded93c5e052d726c7fb0bd841cafe78f6d6885c
fdbf43a8cff90dff4286eea3ff6dce97e71effa5f29bc67eed61e61388fab9e51cd843ed
09affba7c90cddb222fd78e07fc8ed8944cc9efa4afe0ef561fbd8679bffb631fe8ccbb4
41e629d260baff48f9b681ddc11386b6fb79fe93bed0a4fe75e293c2fd1df1accf0bffaf
d59fb9e508c179f3be9ce92bd3a4dc42f1ce6de1aadb84d89e4effafed66a3ea91cf7de0
1de897d974fe18aff786ff9e73ef94f8af4dedb725edc71ef286fe8c55d8a5c5d961e007
b5ed4cb1d979e036ff5afb93d979ffcd31d867ed9dff6cc3d92ce86ef77aff9ad2bc15fb
51afd8fb69e579d99cd0afe0ae3bfedb5ced7ec2ed55fec097ff79e51ec2e07bd0f52ffe
abf8d328e0c30fe44fea1cf2af30ed5fe09e39fab75be216ed4fcba3ffd8a50fff62b2ed
0cbfe59612fbbe4798f231feca79db1bcbff01f753ffafca7aff52e4c19bdd3bd848ebc9
5bd82de09acc80fe9e67e4afd804e7aff165fb21fe93c1fa7cfeca3efb8bd0abdf19d63c
edb584f391ffad5ccba4f776fe54d0a4ed4be43eeaa5d894fe08a5d81effbf2ffc4d87ef
7fbe28cba6f93fafdd16f051bff288fb9d27ff429cee6ce53c95f452a5f18dfe7ddb68cc
fb87d97bffc16aecc693fe7dfa89ec256afcc48cc0f979fe5588ffacca64ffd26ae0b512
fa93f55cbedd85d8a528fabf05f4b432fa69ffa5f3b520ff79fc89f314dd48d8ff933bfb
be61ff30e27eedae53d937dd1294e5af01ee63bff386ffc007e053d910d0fb24dd3ae094
bfff1fb9d893fe85f732ee82bff988ee52a5e18dc9ff02d1f287e714d995ff81d68ee0a8
0ada4cedcf92eac75bd888c7ed77d8ff64c934d6afff4abcf603d14cdfaf1cf942add830
db5df7dd39ed4de020d991d0eb3fd92bedb702f8c586edbb3db6e1944afd3aeeb868ed9f
d05af18fecc402ce63e496ddc352bdff6bf7b607edcd7bdfa5c893d0b944c3ff86f6a0bf
ff71f2c193fe329ed84aa5f596fd7cf651bef080feaf16f286e061f305c753c4b1cb3dda
59e074c8f760f025a5e59a45ff94fb62d025f45aff33fac19ffeb576fb04a7e01dffaf06
fcb422b7fb87f70695e570a8eb8ff281fec075c4ef68fe83d087afca96f5a5ff60ee25b4
f780fe9979dda027fc53d9a5fe22f8aec4e579fece45ff84dabf13b75efe7bf586fa10a3
f130d0a5c57efaa55afe19f34efa14ff9ce517edb241e057d12afb4cccaff76ffbcb79dd
32c89eea78b5cf47c2e6aa4cc5fe7ab5fa9fff17f587ffb828fdb711db81fbbc53f9d9c0
5ac7a5ebb47ae099d883e367c934e45cbff17af74de59fcd59edd346ecadc1dd27fec757
ff17d933edbbff0ee5a5f205ff52fe16d876cca8c1fe6cc0e258cdfa44ffc17ae686ee70
d962ec179bd80c95e3af1efba5ffd995c0e035d955c0fe79e55aec1ee04dc9e68ad879e0
9feb6ef488d979c7fe80f991da98e46bed0fddbc22ff58b6fe1eafff01f588ff69d4fa9a
2bc0e938e262eb97c661f1a3d085ff96d86aecce862daaf00bff3bf2c205f752fe1cf393
ff85d8fa54d2a1c66dff86fa9977dd9b5aff81ee9f3ce094cca5e3934597d8b646b8e094
ed7ee45bfb04f3479edd0aabf31eb8ed80e4af3aff0ed19eff8ac0fe62f9c66cf0d8873e
c64df824a5ffbfa9e03ad9b6ff82f490ffaf24f745fdbb30c1dc02d451f220a6d80bea52
ff18d884ffa562ea8bcfed80e4d361e195dc22ed9310e5aeff79d287d9af2cfed502e54f
dd37e848fe129fffb6fc7ae286d96cfe93bbcfa4dd5ed812edaf2cb5fe24f3b63ce019bd
ff12facb1ed866c5f47dfb64f96ffbb5f62efe7bfb35c71ef9adc798e080d2f960ffcb73
dfa551d81cf5c599bffb2cc64cf242e0a134ff509ff5dd80e579d0ed8618fb77f7980aa6
d861da38ed97c6a6ce85ff6aa9fc93ff85cefb65f3afca7fed9ed92ec8f23adc9b0df947
93fbc159bff85ecbff80d94af20bfc46f8c157adf692fe7bf4abcb78c0f241de1fd54ff6
9ecb47e730ed4bb1fb86f5c26effcb7dd987d6f866c7f26ae5b986f5a1fc0bacdb27d84a
d007dd79ec93d287e4b39ecf2aff43afff2e93eda04efb87ffc493fe78d966ed79b9f693
d7b679f3d37fe6c829adfb0afea03ec2e191d05de8c6f830fe9ecc79ff5aee0cdd4bedca
5fdf2ce89f3ee09733fdb640f956fc87b7fa6dfec4a5bff22ca0ff38a5dab041ed6cd788
e09ccf71ed93e069d927ccb806eda3e07dd893ed88ddb018feb8a0fa7affc937dba542e5
9e0ff050ff0da4ec964ad8a52eed41d95fcfff6cf1a4f486ff9fcb55db13f24affdd79ec
8ff0d67addbe14c1e730d90ce037bfe509ff3fafe360dd04ffcc21b6fa0e89fecb72da88
f1b0ff66f325ffaa4193e0af0ffbb719dd6dfeb4fa991df8aecb73fec37affd766e5c686
e079e604d1b243ec60e079d7ed7bcefd06f29fc0f92ffead26ffb912fb40ffbfa5fb70ff
5dfa2aff58f562ff31fbd169e022cdbf0f9af879febc63f2cf89dd79bcfb32d0fe85fbca
7aff92f39a39bdc913bfe660ef20ff77faa1d96c3afec260bc1af765fea9f479d06cf1ad
f7985bf2a3c1fa15ffa7ef6cacfc68d9afeda545eb63d456dc0ed895d885efb7fe78caed
69d1f286d8a02982d5e58746f6bb06f1b522bef707a6ff1eccacff67e3c093ff21fba810
de4e97e577fe1db6e066cbed7adda7c1dd8715eb4de093bed392bbc909cfa9c557aff385
ff53eeafdf60d802d1fc3bb8fe39f4cb81deab01e643afe059d521e0b1fb7cfead38d994
d88fe2b05ac0f7e59307d9fe95c3e03cd95dff93fbc24f86ffafcd6be080d99434bed83a
debf49ff30bff686ff24fb94f861fe44e402da52f328bef943b0fe3af6b7f14dbeffd869
e4af5cd8fa6d95d9f161b7ed3f9cf11bfe35afd956c7fe85fac75ed893dd7cc1fb4ea5f6
5bfe2a99f2ce7af3c43ce61bf068f8a5fb79e88dde03d895e080fe32f286e58eafe168ae
d89325fe51f2c16abffe11f7a5fe7bed53e02dd0fd81f75cfb2ad8ff0ba74eb8fba338ed
50a5f281d81fe03b9eedd729dc47fe23f452c3fe81f7b179f29dcf86e016d996e0ae3fc1
eda4ca7aff8bd293de74a3e77cc0e065db8afb9f0eb4fe3cd1fe9837edc24792d0fe59f8
c77bd972ccf386f77ab6ec2ab0ff26f750ff0fafe5c708d86ecffa44afff1f98f981feb2
dc35e04dee1cff95fd61f72ad65ac6a5ff48ee23c5f918ffb7e679d88effa5f07fdb88c7
62d908d69ceb944bc701eaaac9689aedcbffd870f2c07cffd002feb6ef85ccfe17b1f37c
e887b5d09fed62e01ecbfe08db56f999fe77cd5bf3c784bc2ceab64ef11ffb5cffc433fb
04adff18d839cfed79c5ed8714c0e186ffaffa2d95ddbc27fb93eea14ad513e53cd09ef2
7ed286edc598f34090ff94ef80b6e66bd8b9dd5cd9a54994ff81c79ed8be2face57bb5fb
94ed1dceb67bff81beed885ac2f70de33bd823d251ee2efaa4ff86f66cffb4faa5c551fe
aff532869f19dd59e5b22c93e6a55297fa68bae868befb03c0ff4bfa09d1a8ff5ea2e584
edc138b1ed04fe89ec1bd8ff7bf6ce6ce4add908e095c6ea70c2ee73ff5c9afb249ff4ac
ff4ad819da5acbee13a1eb5bd80afcb0ff94c1ff67dd0ae062d9a735fb81d6f152e43aff
0ec3fc3387ffc60cfdb8ed13b6fe42f95df4d83ed0f208cb88fe61f6d856e536abd8fb40
b0ca62fa7ffb93ff9ecf87d85dca3cd80fdf61ed82e01dd961d0f2c1f881fd0dd7fbbf4a
f9c8e411da48a4ff32c8a6f179e586b6ea4693edc04eff1b93fbd160dab932b5fd9d4ac8
12abfa984abbf588ff59b7fa44afe093f3c250bfe055d879ec69fb7ef2a567fbd588ff84
e26bdd32ed5fb5f093fbaffe17e5b962e223b7c6a4d388e0629ef1c14aa0ec68de76d0f1
79e586afc677ffa76ab7ff4cc1e09607fbbf95ec0a9eef83ffbaa0eb4be009dd53e819ee
8efe79f29bcc29ff78f390ffaf43e85fd0acec8754f1d98f2fbeff7af6cf8bdd75e03fd8
2dc9ff7af6cb28fb95d0afe549a4ff80f2a3dc5ae5affb93df32d6ff85ca3caff026cf9f
fe0cd52fdea8ff7afb2af7c494bfe50bffc6aa4de52fcba8f951ca9cfa20c04cc9379eee
5affcc92fa6dfe15f7b547f9cb01eaaefb7bd230f6af38d905ccff14edc125edd883f29f
33efaccb6bf779ffcc65d930f314c8b7a9f782fd79ffafe126d8af3ffb9fd5b647e00fdd
8826bbff3e98feb88418c4fe9d40e5b708fa5afe92f796fcad50e00eb3d865ea32dd7df1
c627d853ff71f909d85fed75febe1aed62fdd885e27edd79d986fe61f203d092d9af0cff
449fde913dd8fe79b7ed1dc5a5fe75cfa5d9ff86f4d078d9a502ed48da86d869caeda579
ff86d822f297ffbf5aff9df7b652dcaa5efbaf3ae013ddb977ff3bde1cdbb628fd87e579
d986ed69cbba31d1be459ff986ffc087ee09fac883f096fea1ed6bc3de1fd2ffacf251ed
afc988ec80d819cc5bd613ed8bbffe71f9bd9efe5cfb0ab0f493e417cbaff281ff23d0b2
6ae07bd8a511fa50ff1df252e8a5cd93eb6de35ce986d2afed62cffc9702c1f77dfe87ef
04e54af37a08e058befb44f7bf9bfea8f436ff9628fed837e361da55e00989e5c26bd488
ef81fa99d179ff9ff967fcd753e986fec160e751d0a8ff47f927ff40f2a3fb72f5c561e5
1ddd4ec2e49458fcac3dccfb03b1f87af09345e06fd98afb22ff6ddca5f095ff83f5a5d8
27daaf42f015c7a9cc9ae16bfe7ab7ed884edec19fe647f39ffe37f7c09acca7c781fbc0
20ff43b5f92ffe9ff550fe26f8b531f2afe043d85ad86bdd86ff8ce8c1a4fe2895d885df
5bca1cafec86e1c065baf59cfeaffb6fcbf2a121fa49fe1ad941e00deac471becc24aff4
a6d04798fac59fed1bc0df93d797d886e003b0d913d897f67bfea55fffd02dd8f65c7fd6
e52fd962fabf9ffe04d360d854f335fe4dd831dfc23cfeb65fffce89dd74f239ff4cd82a
c9fb3bd2ff9438f886ffcb0cafdd5dec2ef460edbe3a95f0c3a4dc83d8b81cb6d97bddc3
6ed95cea89ffaff62cffafc61dd041fa62cdaff219ff3af68bffd04cd805fbaf45ce14c6
3c94eda93efbd879e0c1a5bfff6dfbb327f543fe87e09211fbaff08805fe6ff79b5bfe7b
f618fe5ec2ff6ab6ff52b9d331bff21ab6ed75b2e1fe4a8affa4cc11ea38c2e77fed87e0
a0c685e57af2b375e37dcfee8605f74bff93d77cf59eee5196e5a507edadd816b88ec1ed
87d57cfe93e401feaee2864cf610ff61f395fc38eeac0ffb84ffa63ac91294e79f42fb9d
f1bd94ed38dc65e0afce7aed619fe57bed6ddcff86f27af9d017ffbf59afed9333f35496
edc859d997e5abef4effc960d830e0bfabdd39b8ed07cd61e1c0a6e94ff2ca79e005ed89
dc7ae069c2ff15becbaaedc057feb583ff79b5f930ffaa0fedb722fbbf01ff52f91894e0
c2aae6b121edb714df87ffc060fabf79fe69c5f25ffb45ff21d9b54bb8d961d818fed06a
e0afc946e587cb5aff96c0e019cffa7df2d661cbf379e45efe11b5ff88fa9d54febd0bc1
fa25ff99c71ea5d84fe0b688d97ee499fe0fceff87e7c32887b7ff62ce047fd8b67aed93
ff7bf958c3ffd06ddc8ff39e42fb23dc9a3afaa5fe9efb41f7a5fe44a9e06b34fc0f95e4
2af3d14cdf25ceaf64d9fa6affd49d5dea86d899c8fb57fe3787d0fb6dc7fe62d80eddb4
28f1d939b3fb32e597d079e96af2a5ff88f27ce7b988fa9934fea5d105f4b880ec4c9ff1
79bee348b6fb0eb0da27b6d88fde79d807c7f22ed9a5e080d9af4ef2b2f979ffc128fe52
f72bd161f2b74cdd07feacf6d819ec93ffbff71efe43df16cf3de48a24a5fb4bff2ebfed
92d883ecafd12ac55fceaec70bd89bf985f3d977d0fa79db5b9bf786fb70f2bf3bb6ca40
8ae5c3a5f62bf04ba5dd7bd8fa5fa5dc529fed83f86cffd08955c2eb7bdca804fabd9ffd
0ae03bd127ffa748ed1ebee57ff271ff8de21fc4fbd853fe25aeff76d993ed6effc968f3
30f851fcaf61e579ff58ee40cdfe68d833e00ca3ed73e5bf93eba5c76dfb80d168db4c93
fbaf51d8329ce583cfaffb85f295fdb6ee79e5c1abd976ff61f816ff70f386f121ff66ef
79e726dc5686f5bb4cedafc3ed1bcaabe006d7fe7af4aff81dff49b0de87ffc026f2af1a
c0f601ffbf36cda5eb459af7abff1cd84cffc95bdf2cbfce96fb72dd5bc7fb79ccff64d8
28e0c046c6fe9336b9e885dd67d1be34fe53d8a33cfe9fe6a6cf79ea97bcf31bc6b2fb94
11e682f192c8fd44d8a903fb4bff1eefb4e52cf27dffc23ec0f38afbc34abef2599fd85e
d60ed936d89810fe51e509c6a5cc94e357d893d980e03affc293c5ffdf219dff9309ff86
befe4393ff9c4fdb09d860d97bccfd5bd209edb669ff9ded88e580f1abfe1ec6afdd03e0
7cee87e071b7f593ff64f143afed92f79e06dfaf3eefa1fb5c93eda566efd98705f9b0f4
08f8a5c3e618f2b0d256c517feb722ff47ce9ffd3389e3bfa9fb49d85a97ec83ffc49ce0
85d8a4389bfebbd811e49fdf09d465eda5fe0bb9f62cff7df587ff65f9cb83f289b6ef45
fe30c0ff0cfa4bf598d3b249fa01ae66c4e03ccde5a740e961d8ef66bbe684ed93fea4ed
1193ec98d97bfbca4ed831d34ecc28d95de085fb69fe5ccd3efcaff816d84cade57efeca
16d840cef381fe94c914aecffe11f6b72ec0ffabcd3d98e486dc6098fd77e201ed93dd83
edca7fe186dd6bf1d05fff26caa3ffbafa22dd51da39aff666feb9d98647a5f573fe6af9
7fff21dd61cae86dddaaed49c5a8ed40a1de35d0fe6ae080dda562eda0ceb818fb86edbe
9ff1b6fe75f8b763fbd48afab915cdfb29ffac45c929aefabf38ff51e336a2e57efe79f7
97ff8dfa77f026d2bd93e7a6c7289beb85f2cb0edcb379f985ffbc61db23e661ffd943ba
df58d4fb9c5ef27afdc250ff22fabf48cf93fa7aff5df73ba9f50dfe42ebac03f580d96e
ed0887d2a5c0f879fecb19de4af105ebb0e083cd35dab6e154d086edaf3efbbd04cd9fe5
1ccaafff77f7af1ed8adf451fbb3c62eff73edc028d754fe37e80dafd825ed9e14e2349b
f3ae5ddd6fd0f66bffce6de0b586ed79c7fe13f1a7e00cd656e215b6cb99ff4bf312fa83
feda51ff3093fec42aed4be5b00ffba5d19cf2b683f89b77ff931ae5d042d926deb682eb
7beea5ff33afdb2dcc9cbfe06bd8a5c97bffbfa1e551fec0aff342e77b0cedb77dea93d0
6dff8cf822ff58faa52995f19ef934ff9ac886ff7bfa6dfe5cd902e1c264bdfa2798d810
e886df90d95aa5ff93e58dcb87f3cf6bff5ac7fe79cbff52e593c0f910bdec9c4ef321fc
c019fab588d9b946b6fd6bf3a0c1ff37ed88d8b89dd842bb8ad0a5c1e74999fbc0a5d56c
edc338ff53c732dd01edcb3bd8fab67ded88ff6af4c943d80ee08ac4f671bafe06fb51ff
8ef92cda50e031c2f09a36e06afc92ffafc92eff59fb86d8b544bed993d686efc6ff15d9
66d779e322db51e02dd186f290fb9e4cffd96ec9ff7ada71fe55f704feca61db10fb4fff
9541e084ddaf4bf2b685d81efe3a9fe09038c1e195d87adda3cf2df664ff95de86d8af3f
ec70dab10ef960ff79f6d906f261fa78b9de8655ff1cfab87ee38df593fb7bffb064f3be
8647fe0dc7afe013a9fe86f7bf5be51cb4ef6ad986d824cb59ee95fb88f89317d6ff84cf
1fd854e086d999dc12ed2ee4a2fe61ed18e04aaf6de681fe0ff2a5fe6bf3c0a5ecb53cde
29c7ea9315f3b646edaff23bc5a2e5b635f884f17ad81ec3eda9f72cfd97d702e761eda5
c4f179ffaffb03ff57f53cff61e083d805eb3af820ffc493fb4ef285bfd42eeab26dffaf
e020ceff03f6d092d99f30f24cd90aea4abed02be09f0df6c2daa5fb4e93fbcf60d9a043
fb7cffd54de5a1f261e89edf79d40fd84ccbfba95aed94e59ff139fe5ef677c79efc61f2
0ac9aeff6ffac5fd42cbace0b849b5d89641fb18ffbe7aeda542fbaccc83fb9924caa8eb
79cc69edafd045d9b9affb8708c8b768ed6ffba2ffbc7afb58d225d886d07eeab0c693ed
affe54f4accb81dc6de00abcd09efe3df0a1cb23e5c34393efab5aecb635f350fec0a6ff
78b8cca5fe6af579feacd68959f079e9c13b9ef323ffc2afdd3d9afac532affe81fa19ff
a5f37fffa464e8be06ff5ff776cdabed25beff4fafdd7cb6f73f97dca1018eb8f45a88ff
93f708ffcb91d97bcefa5bffd079dd59e208d1ff61f615ff3dfa9c1affa5fa66e24ad3ff
81f3d81db5c645ce30dd0bd993f869f046dba510fe50ca0d9edd935dffbe48fbaff062e5
23c5e487ff67fd5a87fbd671fe9fcb6be085dd7aeb1ec9aaed5cde25e595d94cec36ffba
1ad82bffafe587d85ce40694f2c01391fdbf09cb5cd8bd3cc2ec20e4b83ffad97cc81ab9
fb0dc6a5df81e8cc37ffd469ebcb2df3b4edd81cfbcf20dd6deba95ee564f1119bd80dba
f533ffafed54b9de91d887d977e0c287e62bc17ef5b757da3ba5ffdb7ef092f79bfe73eb
3ddeaffe62face80f186fad12efbc219eda5d02e95ff7dfa58b618d994cfaaedbe17d93d
df1fffa5fb08d366fd5ff728ff86f9c21abffb93df67cbfe8ff285db02fb6df584fecf5a
ffade64add87edabf778fb55afd87affcd872ebffb9fdc86e16cfe3ef80296ed9326fbbf
85e57cfe5b86e4be79f0a2d446c0f725fea0c1e585ee6aa4e09468c1fa9f29fb49f2affe
2ff05ecc9fffdd149fee78fbca8750fa17d855e149ccb3ff9b16bee63497d925e0bc75ed
6be5b578f67cfec342b9d693edc151f608fa339dff80f893f1be46c3ed87d993e08cd998
d859a4ff6dc808b6fa9746e061d071eda5cb2edda526e185d86ef198ff42e429b8d093fe
61f20c96ecacde4ced35ff4def94d3a7c0ff4bbbe09d0eff4ecf39c0ff9b51fbb639fe8c
df82d8b131f84bff3ac2fe06d3f73088e6cf7de0a409bed593fe03ec436ec0fe28e3a60d
f4d299e07cffc088f21f87d6f26cc8aef369feb140ffadd93bffcd08e05beda1f501ff6b
fba4e0b47addc462ebaf5ecc7afa9852ff3af214d250ed10daf03ab2e59fed2fe7afc0f7
38febf51ffb64cf2c763ed34fbc222d0a5c796ff01e031ddaec1fd5af58afe7ed093d8af
29f25bdb7ad0fb74f1afd893edaad922e8ce05de86bef213ff51e487d5a9cb95da79f251
a5d8ff0eacff58c5fb61f63eb9d894f9a8e088d07bffc1912bfe41eeaf07faa2bffd43a5
fb1dff4de4c179e9c40f99f35a9dfb86d81ed964e0afdd31d860c9fe3ee5b60bd8ff14ed
2dbae5aecba1fe85fa7effb878c4f352ff79d75cff06a2d99520e57ad7fa79b7fb94ccb5
68fe7af265ec72f0bbf69b4bdf28d8b408b7d91ff963ffbd73fe14eda01ed955fe62f615
fc71faa567ffaeed2bccaf6bedb9ff50fb19f35fe386c4fe6393f0c739e585d893b6dd86
fb59cbff21f751d936f1b8d96fceb968e5c653dd78eaca86d88dd99802f9b762fbcf86df
c036f1a5ff7efac14c90f37dff1e99f286fec154aedc86d7fb890ce34bafe638afce31ad
fe84d025dd87ef7fccfb76f2acc5f10aa0ea16d850ff0bd99fe50ffe3adba84587ccff79
f76bff9fe570edacde07e6cb86e064f9c587e527caa5c693e054c8f1934dc4fe5cfad8a0
047be093e9aefc2db8ea21bfdc5c9df575fe1df24eff12acee2f95d86bedafe5865efb96
f525feaf79ff2bf6b609e551ed32ffa9d228eda54bfe20edaacb50bee63895fed014e4b7
efd14ed829eda1f76dfea55ad0ff74f9d768cbf36afbd803dc62f7affe18d9af2ce552ff
5f93fed061ffafef91bef946b0d893d382fab6fe1fb7e9a1cf48f13affc14391f79c46fb
afce41b1ff6cb7ef4dff34aff38d30d9f9789de0943bfdb4f6c028d14cc99fff6baff738
fecd18ddc197d8be9ac5dc79e45baefebf069fffc314ea59bed835edc49ad05aff7afcaf
cc64e57cfe6ac8f27bd387fe6df911accaec24a7fb965286b0fb75f661e037d923c8f43b
beed951cfebb08e0bf7bec8ae59b3ebfe354ed99cabd12e0c14391e4993fce2ce278c8fc
5ef767e917d861e15cc610edb686d86698fbd85dc7f3a32cff97f109ccfb7bdd86ecce0d
ffd4a41aecbc0cf5c086d849a5ff8bf176d90cedd07be5b862eda54aff36f36afd4cf8bc
fbda3b93fad543e0abcaa3ff85faab16fb73ee93db9e22f9b842f294d9379fdb60e017d8
93d3ff5388f7bf49d9c5ff02c0e493cd82ff99f2b480e09f29c2e06f9eff9342f951ff21
c2fb60a3ff81f66bfdb477f8adfb21bef76affabf41d95e026c59fff86f296f989fe7aca
fc1df3c415bbff3588d6ee69e07dddad44d706f9b679e5ba4afec259ffd078dd27fec5ec
57dd15fe87f9a64eff01a0fb80f8b87ae288e025afcf0ba579d2ea5791f673fe4af001d5
6de093c1e00fd639f5c679ebd8ad1bffb0f706ffaff17ae55e9ff2ce3ce09efe3493e09f
42ff06edaf49d110ff50f7b6fc45f5c52eedaed19ec9a7ed7df2ce39d80fd93fd0ed30da
79cbec86df9c4cd0afff51d8fb38afd905d038d956e031afdf78e5b179dbafe610b8c823
fd53f787ffa1c94ffe389ded7de1b38e3ffb93f09f1184fbafcd61e53dbfd992e0c146d8
26e6c306fa5fc0ff80eec8fe1ca6ffbf1bdd93d88cdd5aed39ff4bb5fe6be2af52ff1588
fbc777d883e0c4439fff26fbc104affe7bee6fc1ed5df9cb7add69d7fb93e979dbc46193
d87ee9b462fd0df668fe5ada08b9fa86fe9df488afff62eea54ffe0ac1ed81d96dedb379
bef46afb7effa5f593ff80c0fa46ffcd26fe76f884fea5d093beed2fe26ded86d0f560d8
28fbc6ed69e55abcf3d99942f4aac793fb2af752f388ffaf6cfba5cf9fed62d8369d6cf2
cb2fe0b55bf328ff78f786d0aef15ec3f286fe95d0b1ef49a5e62dfb5193ebc068dd87d9
9ce44cd80db7f52cd5b324fda5f71ebc50c2fa9602fee115ff5bdbc08dd894e01ad68ae9
79afcb58e362de1bc8b605ffd978b5f635fe02fabf13ffd252dfa4ed4acb19d851ef04a5
d96da5f08ad75ed938e051e916d29bc0ff1fd9af16ff96ea8601a7d81cceff8833c2e580
ff1ded6fe082cb98df0bd0ed34dd52fe11e086f5e4c24b97f862fbc781e5b0cd21befe1a
93e49e2ad903de3fe06cccfe5df2afbffe20f8b63af557ff79f786ffd863afff84edb64b
c287ffdd9f2ff0c678b9d69af01fff35f44db1eeacff50f82bf0bf26fe82fa7af5cf8a3a
c3e47bd88fdda560e59b2bebb11cb8da88ed9cdd8dd0fd32f7c856de06fbabf48effa7fa
60f23e88b7fc66bdcb44affeb6f681fea045e4adff08da5ad6a1ff16b9fe2cadfa7bb6ff
8bf193c6b3ff5403feafed7ed99c09ffa545fb9bde66b8f83fffcb68faa6f490ff0b93de
9c0fdc5ad879cced74d61bdda5c82793faca12d961df8ff1d83e80fbb868e5ac29fa55af
dea5e474beff8437c2df86d86dff95b8d239e04b93f2aafb1aff5af043cff282cafe7af6
93ff78fb61f427fe5893ed9f1cff94ecb74ac60ec443b6d97efbc7e743d8fa79f2d45bd9
39dd60c8ef69d877ed95b8f347c9a5dd67edcc41e04fc818d74aeb29a5d9f387d212ff3c
f4cd79dcc187eb4fedd273ddbe81e0b254c72cb6d8f536c1ff84f3acff06a5fd8af2b238
edace73e9df17afa39ff16afedcb0ad8ff43f3c592c1fe8648c4fbd027d8f29617fea2e7
01dd4ded9fc1fcd725d861dfa3c9afff8826fa51b6dd44d833e00aceabc67ae8c349bfe1
83d06bff93f2a1f686fe27e5a50f93f3a404e0a520f871ffa5f307b2fe25f9bf2efc7de3
86f23dfdbe79ff9ff996f4afff7bf9cc69bf45e5b893d8b663f931fe10c5ff9f0afea51d
f232ff86fca4f88661b5ee6fe5c34294e7c32de062cfff5ffb81d8ff4de5a2bed093f969
a5f284afd086ff49e705d3f1991193faa54affafcb46bafba5f387ff0b86afff7df6c041
e91f97e4c4aded0dc1fc6df9a2bcff3ffbb60cffa8f963f13ed821dc67d85ae095cf64ff
b6da6cffc577fec786e1bf2ed193d97adfb052e864d005fb5fd4af11e8af21d95adb37a2
e05c95e9a8ff72fb4cee21e59ded7de2af3bc0f383cdfb6dd9bbed12e547beffd553d929
92fbbc4bfe98bbfb0b93e1c218bf8bb8cd0bfe53e037c6fe5ae531ef13b4d96bf9bb79ff
b5ed6ec9e567dd7af78acd5dc724aadbee5ab9ed0e9afe69f9cc56fe679fff5ba5e0c34d
ea73dd84cae561d812daaffe7af3affe34fbaf08edbf3bed52e52a99e9329ef11198fa78
fe3ff7c162ffc4a5febe95b7ec78dc5bf2ce8ffe7cc3fb0dc0fe1fd031ddc5a5c1ffb14a
b9d860fa88e562d9459fe8934da0d87bceed8e19f69bfed014f0d36de450cbaff842a5da
fb30f26de880ed99fbb623d878fec09de47deda440e029d851e004b7fb38ec10d931ff78
f9d36bbffb3bcfaddd8cd884b7f208c0e080d0f01091f296d515ed4a9bf488fb9b31c2e2
9f52c0e073ccff6bfab086fe7bcbfb59d1ff52cded4ddfafeb9e0ded9521e14cef38ff1e
f79efe8845e402b6ee6db0da84ed93f99817f25688d97bfe1cf1a7d123ff93f0c107f6b7
e33bffaf27fbc97fe062a8e07baff61bff88ed6ad0ff865ce0affe43c7ba07cd61eb94dd
af50fa3bff21c2fe69f5adfe86ff7bcf9cc0fe84ee95e0b04afe2da7d96dff53f313ff46
d893fb2ef73c95ffbb2cfe60f8b3ffd225e04dbeec9301ffc61aaeea2ca5da22e0c116d8
b67feeae6ce0a96cffc31a86cffb7acbfa80d886e0c58cc13bc6b4fb79f5d73ecbf32dff
4ee06dccff7ed0fb05f5abdf9635fcb659dd29ffb365fe71f2c479e0a04fff02bffa5aff
38c8b660dc26e09f04c1f7961dd1a5f77aff9ff486ff10f692d8a8ca96e080da9f3bc4da
5fe922f253a6e343d80cf298c0ed79f9be27e286d07aedb2eb5adaa6c2d96ce5cb80d9a5
3b87bffe79ccff5bf6d06ced95fc7bf7c779f162fb9cf438de0ac5fb1ff7bf338cd9ff45
a5e039a1ed17f4b15ad9ff82e524d8bf5093ff9b5ae0a5bf04f642abdd38a0edc44886ff
d86ac9f87ed86de5cb20da9709fa60edafd894f230cf9ade7efccd85f37cfeafed49caff
86e028d951dc2ed758cc64e819f35bfb4bf70ebfed9319f7a6d792ffd867fa7cff88dd1b
d8af02ea98c5fe3df7a51d86ffbf61fe21f44ba8ed20e3b7f25695eda513dd79b5fb44d8
59d9973eff9ec942d387ff92f34fa5d979e1affabd60d7f669fed976ffbe2bfb9d09ef98
fa66ffabe01cd8fac061fbd9a2bee779fec02993e8c60cafed9302eaadfb46a5ee81fec0
a7d31ff840e779db88fa0eee40a5ff56d435d871dfa55aef69fe92f178fb7ef19bfeafcf
88d8b893ceaaff4dfbb0c964fb49b815ccabc657e575fb68ffc386fb5dafe06cd9b8e09c
01ee7de086c7ff79fb88fe04e7c434faba87ff2ec1e582ff15edafd002ecace457bfdc67
ffce89fe04ed4b93f1ae25c9b902afcc67e479ecafd348bbcd0ced87f7b68615ea79c356
fe23f265e4aff360fb9df73fd9ffc23397d9ff53d131ed48ff93cabda4fe51ec72d88ec6
e917d988f694ff29f9bf0fd5acc514cbb3e404d8327afb40ff09ed33e07cd686df33ec94
c3ef9ffe2af7b638f4afca4af236b6de0ac2fc30ff4bf2c396cb41fab609d843cd5cd886
ffaf68f2cf52df9c0bf1a5cb66fe86f570fe13f1a525e5a234ed5bd886c7fc14dd93f26b
fdd83cfaa9d052fe88f87af1a1c64dce33ffd489ff98f186d894cf51ff86d93ae05ad0b7
6191f2c50f86b7fb93bad886ed57fc0bd0b726ff9ff452b4f26fe3b811b5d87ce9a0fb44
f37fff4ca5ff87f7c19feabb90c5fe61f225f575ffc007fe3de087d97feacea123ed95d7
a5fe7af6519fed88d372fb30ffa4d673eb93e09ded6cde1dd9c03cadf985f3afc748f9bb
30e04dd993c579fecc6bfac681dd9aff2ea7e55aff43ebb681f29713ffb732de1bd836fb
81fe92edaf53f237df0fe54aff0cdeb718b3ffc285fe17fabe4afeabf6cc1bf250fa14ad
df7de56cf2c85ed723fe86c3fb46fe9ef263fb33cf6de489d993dfc242dd52e01bd268f1
58a5d88ecf9add5aa5e07bd86fed5bff058ffed960ff16e656d888e5cb64dd14e5afd862
ed1bfe52f67dff29faaaf574fea0e020d85cfe89e47bdda4c1ffa92afad83bb7f20fb2ff
25f064d0f779b6d29fc625dd51e5cb85f3c86fffb6e560dc24e464dda4cab465feafc683
ed7bfba0ed892aedafdd79e6cf79eb5b98e37bd79cc3ff37cd9cff44a3e483e664d908af
cf84e044dac190ffb71dfe39f923f2a0bff46fff96fa26bff903fb4ffe16bdfa4cf3afff
1dd0a5c1f14486b6d093bdf42affa520faa2fe8e58f3bb93cfaeddbe16b7d99352c1e50d
ef8bfd7be737d81bff52fb0a8bedc05b9bea7dd89edf54cb85e0a03ec1fe0ae37aff92fb
ab4ce85ea1e0934aa5ee79c9aefb07fe27f8d89f5af9d03fd962d85dcef99e4694f3229f
df2ad4ff41b2fe65ee76b8ec1fc6b0fe04f9bf96fbbb5bed21c0ffad01ed4bde9ecbbd79
e660fc1594d8af46d9a4e56deca7e06dcbed81d9a430c799f63cdc62bfdffc31fa64c8b5
6dcfedb348b9f1cd0fff4efb3985fe9ff378d1ff36afd858d142c5a0fa71f0afd282f2ce
60feb1f707ff46fb72f4a5f90cfeafed83f391ef60d80fc5ff22d8fe04f7bffe10baff48
9dd886da8a2fefbf1cadffb9f232fdbf07e4b6ff68b9fe58f7b06bedca05d93caffb7ff7
88ed7ad8a83def2bd2ff88faa55ce593c5f779ff67eea9c793ceb0fe2beec681ff39d8b4
3eb7f99f41ff10cdfb68e17ab6fd96f80e9dd87fe011fbd93987ff80d928a7e57bd8a8f2
c42de54ce008c69cfb7dff85d9ff06addb9627edbe43afda1ee088d0abc793e319d862ce
5dd92cd84ecf31de81ec9d64f1b879b1cc6ad894f286d0f63cf24fffe677fc9beb8a0897
d9a552ff69d831cbec81dbc40cfbbd7ce588fed00dd94dd827dd5effcb7dde9938e069cc
f33afe61afd90fe049fa0bff3bec62de86fb0dc1f284fe88d924e5b98ae37cbef10affcb
29d859c9f34dffaff25d99e9c303bff786fd3dbeed058bdeb568fcb1f97ff15cdd1becae
65bef43ffec26afe9af57afba840e653f12dc0ff88fb95f27cffaff76dffa6f953fcafcb
40fbd929ed3de850de1eb6c670cba5c0d93be04ef7b6fe78f5cb83f08efba706f94393e1
9f30ff51f2be6af4b9ff6efbaff11b9efd6df8aebff60c9dddb7ec2ec0f587d790d99dd8
87faa94bafe09d4ddd13ed96ff55d4f561ff39aedb51a3ed89ffa878eda03ecbaeff52fb
9eec42b6d899ff6bcbfa47ffcc9438a1e223ce96f8c131eecd86d87ae9b40fd836e254c3
ff7cfa98d98651e53bdd1fe0bf0595e4b81bb6d830dd83e39658ffbe9ac4fd6bf97affaa
fb016ab2ff85d56fde47e320bae516d84fe0c1a2bfff75f4cd86dda52be09636a5e8934d
c7b6e147d811ed4c86d8ff841da5fd9451ed2efe6cf15de401d8c4f363ffbd79faaf61c6
ed861dbfd194ea6dc6fa79de25e2c305bfe886e019d179d86fffca5de424ddaf83e08c12
f3b9fe6db5ff46b88dfcb64bff16fa50caf781ffbf95f21bb5cb10febdf7a5d07afe9e5a
fbcd44fb9cf27efe6df412f9aad079f30ba6d993ed13e25aedfa22c4f212fe95cf86ff6d
a9fe94f77dff63ed19d948abeb16ccff57fbb6e012d0f682ff68f3afff92c3fdaf49c3fb
d36dd8ffa5c682e525ffbf86fe3593d821e7cd33e0c106abfaaffe4bf823feaf13d05ef9
6bfe93f729fe69f68af22edeaf0bfb7af454fe1eb6efd573dc51d2ed69c4e610d86fe594
d08ce0a546e8a004df61d4ee6be0ad44c601ffbd4ac3eda878dc85d858e006c9a4d387ed
19fe5ac1ff32cf58d689d89479da9e60eaae2bfabe3fc4f258d03ad927d893fa7ec1fe88
f9799fda86f068fea73ed907dda530cc57e229dc7beb9345f708ba60f9da52d0b242eaa0
bffd78f85fadff7bfc93db36e180dd9cd885f293ffabbfd944dc6fd497d941e0a4fe65ed
93d2aac798d0a5fb3fa3ff25f7bf03acf579ff9bf224dc55f629ffbe68d8f884fea439ff
80ed93e5b46ded93f831c8ff14f339ff96bcf74eff39b6e086afdd80e0a1fb76fe30e5ff
46fbcb7dddb868ef9ee01ddc86edaff25de53bb5e023d85bc6ed01cf31d888cbfb94ed79
d0fe72f4a3fa93fe13e0afc99ae6c21c89b7f571fbc55bed07b5cb98ed56d929f369ff5c
c802ef54e435dc4eed1c87f4aefd55f17dffc311b9cd35f84bff14f160d96ae5c985d89e
63fed834dfaf43c1fe7ceb95d97dcbfb34b6c827ebc15ad621fe5bf4d322da6de39061e0
c2a1d061e788d8bf93fb47bdf022fa4cf125eac593bfa5e0b818f23effd004eb64fb76ff
c102a5fe86c9ff6df6a2ff38b1fa80ff5af326b760c0fb2097dfb602c851b7ef80ff5df3
40ffabfbcb0fdda51fff92d0f545fb16d588eca5b9cd9ff4b686fc79caa5fb95c1e59e17
bbd808ccb066ed79ffa5c1e26ddf8fff27f8bb0aed5be5afc687fa61d0fa67b5cc01ff5a
f2189eed6effaf78fb9ef6b786d9379ffbafff0dd1faaf51f91ffeab35fb1def6dcbff6b
d89dca8cd9ac48f70af06186feabe079b0fd8dd4a5c94294fccf2dde9909e8bb66d895e3
4bddafe279ebc6ff41a7e7c746ff85f1a6d961d027db86d87ae03195fe83f2ce7ae0589e
e27cdc6affc34ce519eb42ffc12dbcff0ace3bff5bfac679ff93fb26f897dd4eea1f95fb
c54fc0e99479fe89fa39ff17da7bec0ba2ef2bfb88c6a4d2afe087d94ce4ba0ad943c9fa
69ffcb8642bfe9a32fed86d8b679edbf73e5add90298e55bff07f563ffbe9ac633baec93
57c1f438c252ff12f5afe577baf86cf2aad141ee0ef876fec1199dfc930a9fd8f3845ced
94d643fb23fe75f4aefb16f061d8ed4ec73baff719fec226ffb9f20c97fb86fe93d868e0
a4e668f583dd92d82ce0b13ce85fb6d539bffb88d9bf2fafed9d44c4dd52d9a5ce77ee4f
ff93c2de74e1a7ed32fe3ff74efe10f667cefe84e59715ecb608d8f0934cfec494ff49f5
cd08ffd69743feaff639d286da7cd81ae453fcd0ff1fcdfb0d96d8f8a1bfe061d81eef4e
9ed852fe89faacc7a4d02693f5d237dcb5f88717d5feac10e5be9aea86e4a13ab9cf9eff
b677afff9de85ad586edb1894aa2dfbe32da5dcf79f01afb46d9aeec54f17efe6af6c09e
c3f283ffa506f255fe87f602feaff411ffbf26f399c0e0aa2ffb41ffbf5cd886dcb67bd8
93d096ed37a5f257ffaacb81f3a562fbd760f211adde699fe29256f9c765d879edb8fa44
fea6ee83d88e5d9fe4ac66dbff8426ed4c98ff91fa87caff15e2c027cc7afe53efb0e04c
bdff5ee044cbfb9935cef763ff36afd909cbff59e544c604fad226de86ff6ddd37d0f6b6
fe6ff9c878f710feafd193f3b8249dff06c9acdb0eed4cfb17d961e5cc7bdc9de079d886
d872e0ac7ae74cfb1c88f2cc82d99911fd96f009c8ff24f25bff80bde024d879dd51fe3a
e4c01cafe180befa27c3fe3eb8ed26a5f22efea51496e0c235bfff24f5edc84cf2d4a544
c4d988fbcc2bd851dd37b6f360afff5be513dd6aff82fa70a3f07dffbb6dd9ed79b0e08e
c3fe54f87abff17bfe89eec062ed52d80bf2a2fe7f08d83ee81fafed88dda53dff61c97a
fbd870b5e54297fe87d87ae59cfe3cb1ff1cd334f04cf92affc058f2c494d0affe55b7f7
5cedafd644c0fb9351e59fd82eccf96afeafef1ae9afda73ff9bf235cae66fb4ea7fd1fe
64cbff86d852ddb6f36193fb9a56dd7c0594ff8816fbafe56dec08a6e580feaced7ace96
ed85d993fb86ca34d907e6cd11d8ac2af257b5ff48cb19e871d794ec1fa5d92ed84b9df8
82fbb3e5be48b5f1aafb94caa2ff37d851ebc298ed0be4bf47d0f879fbd062e234ffb928
c4ed5dc1ee80ffa9c79aebb033fbb506fe61e57add04d4b52cf481ffa564dfb979fa75f4
af03dd9c40c1fb935dc4f62dd879fea003ffd144f81493dca10fe576ee85ff2acef208e6
c4a5faafda3ce0c280f120ff5cbefe48f2c20d9aff2ffb04d73aed4ab8f39fbff2af55fe
74ed9ac0fe05c586fbbf9bf52cff5bd0fc85f493ffbb15dda52291fe85da2ae04ced65d9
7ce693ff70f925b5fe5b93ff9f2dedbc1ef2bfa5cd88f96ca2f7934be2bf6bfb16d162e5
c56eed86d822edacfb79ffca63d91acff520fecb14dec263ff7ac6f78761d8fe05a5ec8d
db5bcff39362efa9bfe535fbc1affc1acb5ce67ab2d769ff3ecefe75f79dfe4dbf91cea5
e079daaf69fad36dddafe575f6c2a8e821fe5086fb93c4e41efa62d893f1b631ed4bafdc
87dfaf47ca0ee079edcc6cffb8d83eeb99ffbc90c1ff03fa4ecb08bbd891dd81ceed1adf
c45a93ff9e4efa01e746d7e00fd0faa50add5aed87fe9f1cd9aaf952ffc1479feb50a5fa
8dee7ab4ec5aadff9941e7b8ed32d9baff3397f1bf50ff17e5ae3ac1e09e58ff79f35ee0
3f8fb6f99ebffe50f8bd90f06331e9c125d886f5d944fb2ef7bf1aebb740f0c25793ff9f
1cff83d297e0c317ed40afd086e72ee05efdd86dffcf61fb15f39affbe60f93aafe630f3
78fac111cd55f21fa8e1bf9ff3a8fe38f54cfb32b6f468fdaedb79ccec85d87bffb87efe
9a37d8f588ff79ca37f2bcff3b9ce0936df9c517c0db25e056ff36c389e16dd1f2881ba2
fb9312cdaee049dd86c2ee76f987ff1efbce2ad994d47dfec6e94adf0ad9af3ae413adde
d3b368ed97ff01afed7bd89d64ffc779fea31decc545bfe06dd960ef3bffa1bdf968ffbe
52ff9ec90e93e4a103edaac767e273d9a5c798fe52cf96df59acf288fc79d5f7862fdd5b
e07ae99fd3aee56fccb003ed3ae516abfe30f1af22ed51c0ff6ab6cc40bae693d54d91f1
d90bf5d336df94ff73fd9abed19fd9fb0bed2cbdfeb2e54dd3f97cf466ffa4fa3fb0d854
df97d871b9fa87f106ecbe2280ff93f179cdfd6ed8ff7afb0bfeba49c6e579bfff12eec3
3a96e05dbbf980fea6f286f706fb7ed988e26bd3b30aeda4cf76f8b1fe3bc8fa9340ffb7
28fa39fe0ae07dd987fe01c9ff63d833dea541c2fe93fb1ab7c65eff1299fa3cfec06bff
85f6c960ddc16dfbc6a5e586f124fba5f709ff78face67b6cb5cb0fe87f35ae5af4bf702
fe4684cea5f98149d96dffa757e028b7c808d496fc0cfeb131f5af0ae04daeff528cf6d7
af37c2ff1e9ded9329bf52abd880f2a03ffc51a5dd86f6acfd05f4d668d90fd832ce5cdf
a5cb1ef44dfe2af6c47efb1ff24cea82d9b95be5d379e8cb7eddb6f05ffb19f161eca52c
e593ee7cffaff06cd984d0ff2bf278c8eb81d887dea0d0be4694ffa653e2964af217d95e
e07dd865dcb3e013befb29ff85e89e28b8d80dcbec7ddc93eebeff4ed8bffb93f10dc9ed
83d0fb7af067e778db7df1cb5fd9ff95c4dc6bcde49e5afad9a557eabe42f8a7eec5f35f
e214fec193cae935d75ae074cbaf2cff9bf58aff93fcaf43ffb77ad888e092db48afe18a
dca715f188ff24aff906a3ed9349a1d88bcb9fd681fabf6bfe16ce5ae40dd429ee52a0d9
8be0af44ff20f34bf82bfbafe011d0f80bfebf90ffabc99efe2ff39c3d91eea053e597d8
14faafe282efa233ffb749c72690e49513c73eb6e08f38ffaf1de09dff2ec99fe54fa9fb
88c144f820fba52ffec11188f2d379fbcb68e07be528ffa2d061e02af287fa6eff1eb6ed
7ae554cc39e051dc24ebc167ddfb03f1aa3fffbcd856ff34c1fbad42d89eed6dc2fe31f6
baff22f74cff26dc50e0aec799f9bd95fb82ff93c6f746fd06ee88d0b973ec96d864ed86
f3799ed872e036cf51fb07c1e479cbfebf61ffd8af3efeb75bed40ff60fbc16be79ff3af
f86efeaff59fff60fbc1d961f7bf3acfaded24c0ff18d52deab17be584edb96aedacff2b
98e002b5ff16b86cafcb4cfab27efbaa0cc1df93cefa3dfec493f2b47cfa9fd386f2ad34
b1cb64fbd5840dfa87c89be06ed0f57afb52afdf63d779e167eda7da77f296ff0df552d9
36ed4bc1dc61e410b5d86acba5fe5cfba5c707feb61fd85ac7ff3ff4acfa7cea87ddaf47
f9b620f2d02f86f6d071f1c780d893d020e4b216fe5add07d839e054dd2dd8a50193eda0
59f279fb6cf85fafedb7fe6dffce4ed801ffcb43dc86c7fe4ff47cd89efec1fb86f01feb
bf42c5ff9a27ef5090dd9f13fb61e6be06ed5aff12d0fe79e5bf229de9c0a0ee1bf851ff
2cb6cd10c0ff1ff3b4ff0fd0b33dbee9ae5ec5a4d889ffb67bffa431f9a5f477ff9af92e
bfe40fdb56e279cbff88f924b6ed9213d8be29f657ff94d86de75aa5ebc105a9dd259ffe
08fa79d986f7cd7ad884ff98ed7bd08def84f5b2fe3dccff86d813ddc593df863d97d816
bcf58fdf7baff876ee5eaad98ee734f246e005d95dd76ffe9fdc79e5b881ffbc63f7c0ae
d923ffca92d87be069bbee4affaff45efe3dccacd594c0ed68fea5e081d89646a5dd86fd
94fe07cdf837fb44ea1dcfe504e0afca52d3ba38e251dc63a1f77effaef44a9fdd77e459
c3dcfd67ff99b8d486ed03fe97c2fe77fb8aff55f8cd76dea5f24dff3aa8f130ebc047af
ff1dfa6bdd50e280d8b60ee495fea745ff03fac8f65af29a32fe50ed1cd8b60df9d01ffe
5bbacf9467f588ff95d90af24ef837fed602e9d029e34b94f1a54efe28f5a5fa2e99d86d
d936d086e56aff49f207a4e54df061fa39f2b8fb76ed2ed86ddf86b7e593cbaffa5f9ef6
79fb84ff1fed8dc5f286fec340bad63395edc039fcaff2862cb5cb45ee1dfb34ade0b044
dc10d745e496ecb93ceec02ec5e694c1e086fb68a5fbd264e5acce17ffc022fa8dfd53d9
34f2c09bed6489b0dd79e0c0a5d099fb59ffdd9c67edc2a4fa77ffddadce27ed7de4c093
cdb46daef55a9dfe74ffcf6dddb784e9c23ed9c5fe0ff67efe95f101d986d879fec77dd8
1ccb9ad584d919cd5bfab9f551ff1dd469fe6393f2c74cd927e065ddaefb02a7d81ee08b
f065fbc916ffa5d00496ffd86ce9a4c1e06fc7f179cbff6af882d9b61cc76dffac62ff5f
b805f44dd911c5e12993f69b52fdb76994edc55dbfec7dce85e252afd9fe0fc4ff3afa0d
f162c8b98840c0fb934be019d82e9742fbbe51fdb062ff18f2d942c9afed84daa60cf435
fbcd609eff934f86edaee017dd58ffa5fa28ddaf36f994fc79ff02f45aff93e09f16a5d8
7eecafed0bddc02db3fd93d09bf2c04380beff6cf499ff26eab680e07bdb6aecc14baffa
07fe5293ff9f40fa18a2ed93e55df387fbb210e093d6a5fdd277ffbf9efe7af3b905dcc1
34edc4fb459ef32ba5f760ff1dfbd02ebdeb4faad87be586ff37f4d8a6e52cccff81f6b6
edfec269e7a1d023ecade060beff80fb1bd839fac782e19a16f2be06e2b5dd9e46befa93
d2b861c4ec7feecb6ce058ecb9de88c975eb3dfeb4f23bfbc32d96f755ffa5db15ed56ff
1188fecbeb4cddbf59cbaad00afe52f626fa85fea5ef83d98af2cf0cf3d28dddbf39d022
ffafe04ad8f452fb1def4b98e89035ed50dc42cdfb80ffaf870fd4afdb71ffd006d893dd
a574fe82b5f467fcc646dbb4e28108ff61f3b30ed8a54a8612e2b20cff79f5c5478dfb97
10e46bdd8eed53affe5cbaff82d0fb79f825fece87c542f223e69f47ff0ca9fe24d3a33a
abfe26f9a5d07ad986e06d9dffce75d888ed6afe86d87cc6f09f2493fa9f16f879fb83e6
93d9b0cd5ee03bd81cd05ae528a5e4bb61fe59f786fca8c83797fe7bb6cb9ee37eddc224
fac6a5d786fea061e559f1caf765fe16e5b583fb6ef142c7ed5ae027d2bf21afed93259f
fcafcb93d378ed5bfec7f1d87bf9c787d9589cfed832ddc1a5f746ffc4a1df20d2ed40db
51afed56c963ec1dffb479fe6ef7bf93c2f288d97ef6b6ed52d866dd0eef4dff03bde741
aae219fb3ecbafe638faa946e0b5da36d1ed86e02bdb4df21b87fe9dbff579ff9ef57cca
ff4793ec2ac8a5e961e17cf2cf01ed2dfe67beff39fbaf5ff207ffb61eebc624d89341a4
e08af2bf3bea4ccbaffe9f0af795ff86f99fff70f6b8d950ea3cfa23febde08732a550ed
38a7f22cfbb804bcf75afe2bccb68605fe76f8a76df692fe28d59fffb896f369e3c595d9
18e054dc3ce550ff0bdc83fb9cf291fe87d891ccf360b8fe86f279b6e4089af279cdff63
f872fe68b7ff51c59fffa9c0ee44d912afe549db35fcb668d8fb7ab5ff08d8b413fe51a5
d988df8cf20ca5d87be1bf93e075cbf569abff7ef8b7ff2cd85285fac3a5ee1a87e1be79
d960e406de51d812fe6af282ddace187419ff7b7ffd386fece6cdd7fd1ed69a3e67eed61
d8f3bf95ec3ac1e10bcb6ae75fd908e544abd905fb3bafffa5fb79fe86cb9fe860d01ae0
35c659e52dfc4f96facf12d84bc9ff84fbd24bda1eb7ed06c8afe810ceaded61cb2ee068
b6ff93f986cb93ebbf12f0af1bc2df6ced50ffc29cbffa69ff3dcf5bc2ed64f617ff3dad
fa5196d5f24be00add61edacffd99724ff78d5f930ffd038f2afcc7bf186e49ac727ffbe
5e97f2b7d903db7024e5b617ff9ef75093ffce1fd893ff9e30de5ecb98ff7ab6fca4c0ff
78f78fc6fd79f166c1e98833d0b912bef327affa93ff7ab7ff9ebcf6a9c0dc28a4ee88e5
9f20de61baff80fc86d4a0e54197fe7af505fe91f388fbc634d851df02ff4da3d981ff9a
f440fb95cd78f435ef1fe5bf96f8acfe29d288dd6ac5ed27d9ff1089d0a3fe7bd89d02c5
35bfe093d95db6ca56acfb9543febe2efbb83de7a5cd06edc41dff61fb93eeffc364e05a
cb09e5bd3ab2f45be00cc6fb7cff14db54edd747f21b93e0c150ed29afcd9cf95cbeed80
f2a1e26afec732d84cc8f409d94ac91ced62febf43ff67f8adc2f52aa4e05aea32ff79fb
c25ee093d96ddf47d80aa2f295fd7bed6dc6f360e53bdd79d388d91ee684dd92d8a848ed
18d86bdb53febf9cfb6eceb65feac1fb34afee3bfeb3f686fc4cf40cfe88f39cdf11c9ed
6bdb9fcb79fe87f46cfe55fab17ee8c53baf518ffa95f289ff7ad8fb78c0fe85f2ac4ae3
aff1a5fb2686e494c4fa35a5fe76bbff43e222d8ff09d852ff46d6b779ed86e4af5de67b
f293ff87e583f195c4d936ed4e93ddbf14f7afc693d81af1ba30fb4bc8a6fa7cffce55dc
28d09cfbac30fe96c7a7fe04f75bffa1cd5dff75fbc49fff80f594efa745eb0baffe84f7
a64386e6c877d989d25deaaed081e76cdd1fec84ffb788f819ff4ce00cd842db8bd47ae4
c1459efbd6edba1dde3ed860ec9e12f19b33da52d2f89336d065c6afffb132ed5eb7dd12
d0eb86d87cfeae72b2fa90c796ef06ff99f715fea0c0fb25e053d20cd851e104b0fe7bd0
ff61facf9865ef51f6b06fe4a5d087ff1ec2ed3cabf783ff5ed91fe0b4cd0dfa5ac1ed81
e0aa2bfab909ed32e261bccb3be003cff790c2e248d91ce0b5fe970eff50f220dc9b16ff
bb3bce7afbc14ad633e459c6a5ee8bf87fffadf033da17feacf10d9440ffc179fea5f62f
bfdd66e6ca88ff991cc1fe8bf909e958d1fe81cdfb86e59e4af70eefc32ef6ce3fe628fb
61b4d93fb0d862ee39aad87ff8b5fe6ff7b6fb78c1e80ab5ed4088d9ff0bdf7accfa4dff
13efb6e9965bbfe219cba5f091f685ff79ee86e634b2d045f1bf51ebb087d993f20efbb3
86ff5dba37ff87f29fff58ef2bd9f486e57dff70fbc75aeda0ffb651a5f693fe7db5e96a
d0ba45d8bf1f9dff86ec67d876e0c0af69e4a5cc21c7acfc47ffaa17ed42e0afd959db85
d88df49d03e0a023f056ffc891dcaa5aedb761fe94d8a5c0ea6dcbfe7bde8accff5bdca5
3d93d9a73293de27a3fb82caacfe2cb7c89dff23bedc86d9a54380feaff479fe62e807c8
52d838d94adea0ff69fbaf79fed669febe4fff7dd856edc779d8fba5d826ca67bed57acc
67bcd630c7b0e043a9f77cd906edc6e515d964cbfa01fe2cf39cfb6ccaea4bcfaff533fe
86f6d8f90bf25eff6dee88d184f3bfa2fb6dff7af529ff4cde3bc7f74fffbf79d9af1dfb
67ff9ed283dfac18f34dff20faaa2df147fa0198f115ffc5f21effc7f462ffd15de019ed
64e558fb3baae1932bf765fec8e533d80fd09edd88fba0fe7df2a5fcbb10d8bf21ecc50e
addc1ae5c926e98efea32de7981bed60fd94f305fa9cfeaf45fb9af506a3f0cf23e46afa
953986ffa2ee2898dd86d874e015b2fa63bdfb0898d95bce1a
    >
  >>

  /Magenta <<
    /HalftoneType 3
    /Width 167
    /Height 167
    /Thresholds <
d8af40ed51ff24d350d812fe97dd67e0c16ce5c552fbd331feaf05ed5dd033f0a5ff79fa
6ac0e62fd865df98c3d904e093d0a8bff303e49dc8a5fb5b95ffa86edd7ee2af1eff87e8
b666df86d934cbfe7ffba126e8c19fff4ee53add9e1eed52afdd6ad879dfaf71fd99bafe
9fdd7dd891d82fee9dfd1f96f012a2e028ed4393ebb6da4ae099ec6edd7ae65cfd19cbf2
935ac3fe86fbcf27ddabfb70baff3bf81ccf63fb88dd7bf969ffba8fc3e586ed7be2c242
adf505fbaf28f3ab0bb3e975da94c89fffba61e046da22b2d977ef9ffe0ff156a2f66df9
31ff4587fec26cfe79daaed821e0c014f54afbc395f30dfec421f577fcaa4ad603edbb5f
f819d8b893fe79cff97efeca39fca5f339fab816f247cb12aff337fe74f5af44c9b1ff7d
d7fb63ce9fc1ff840294f2ab59bcfb41f9abc99eeeb64dd7faa04be11ab3f8875dc5ed14
ccaac69fffa9bfea38b60be4c11dfa64b6fe38f9b269fbce88d986cbff5fd8fe68c1f73c
ff4ce41fec86b8fb9ec4ff3bfcbf5aafe586febe42cc98dd72e5d2af4bf21cd23bfe6bf7
88fe9fb7d387ed41cfaf75e09dbbd00fed8ae5b16bffd081dd70fb07c2ec2aade41696ed
c40fbed985e5d080e08dfbd45ee0a8de17d0fa79e52eddaf48beff0cd952e3c7fd2acfff
0cd29fc604ff44d87fff8815e0adc6f462d8bdfe3f9cfb88f35aee47e4289dfec7f2a579
de95e017cea7c70ce7be27ff5df04ca2e280baed259de088f2accd93fe18cb60f285e09b
1cf9c64ad823e7abff17c5fbb812ed97cba6ea93bfed51d028ee57ff08a9e06bd8f83cff
4cfa95c0ff2ff8c33eacfd59f2a3d9608fffc75bd8f54d8cff9c49fe23a1ff60ef3487ff
c454bffe9559d986f868fe93db70f47afbaf47aaeb7fbff366fe82da93f5bf27ddc2f666
ff3391e5950ed9afe060d823dd93d879f4cd4c935eccfe3ef25aff6cf287ffa151ed95d7
1ffad014f24997d8fec216d466fb57abf27dea12d54eebadd083ff94f279dd7ef2a54c93
ff7ef82fff57fa06afd97be378da81c8f784ff25b7cd93ed79e457a4d97ade98ec0de5c0
38febcf04398fb76a5e0c062e9c676c1ec3ccda5bfea9a0bed903cc3ff01edacc917ed39
e4a5cb29f18dff61dd3eb0e421ed5ae666a4fb9540b5ed9ebff948ffcc85ff2ff784ff70
fa06feb67cfad8ff21a5d889cb9edd2cd979d0fd7dd96febb261fea0c6ff864d80fba5db
0dc1e03eddaefe6ff78aff3fed0ccf65fe38d056c1eed83cd962e0bf91d59fe536ffa6fb
3bf3b72cdd5aed63e509afdb2afecc62f01ffe87d7b27ced951ad6afe004ccff20f9b22b
f694fb6ab3fe0afa50b8f766fbb6e872d89e40f2b99dfbb821ea99d3bf14e588ed7bcbb8
87ff2bc4e10ed5fe58cd06d971dfa559eb6ccba4ed45d0b987c23ded13a06dc7f660ff09
f77ffb58f523b0e40afebf7ee0c13fe501f5bff1af44ff96f479ffb82b95deb608b9d97b
de51e4c0a0fb88ff21b6f49cfbb51bf643ff86f1c10dcaa5d868fdafc79efba7ffc35bf3
b511fa93d2b854fb2cff50c3f77aff80f3a860d979edd35ae103c4f286d879e5d07eddc6
1fa4f35bfecf82ff66cd86f27aff5df886c3fb1aff4dfad96fb2fb51f3b67ce093f37ffe
15c0fa24b6f30bc6a7e631d9f193d0b0e1eeac2fec7ae550d1b89cc5ec62c0f29f42fb2a
93fc79afd99120e5c484d838b0d068facf47fe97f262fbb7ffaf29ed05d9b1e563cd09c7
5bdd73e0c35eb891f487ff1ded974bfe14d44086ed9bd183eabf45ff84f1bf93d0a5e065
dd2ed247c1ee91fe0ca4ffbe9bdf4ddb2efeaf23ff4193fed333e0be21e04ad906ff54da
3be0afd836aed98bd89c11c1ed73abcd61ed2dff4de6c495ed79d0fe86db7afc81ffaf52
fb28ff4d88fcbf9ed8bd93ed04fe47adff934edcc5aaf2ca51bfed44ceff6dd926f8c2fd
04efbe86e378d932d8a01886f393c4f57b4a9df979ff81f393feab14fbd92bd250dbb56f
d7f279e28ae9be1bf74cff389fe0ac18d94ae602f23cfebe93f99efe25d055bfdc8631f8
6eff91edc161f1a2c2e46187ffb079faaeef78e7bfa3c4fb870efe9ff64ff238f5a8fe39
d8ff20fa86db8bd8a531ff43d9ae38e553ed1ccb5df397c0e081dbd147dd12fb3aff69bc
d88de018cdf879ff0c87e9a5ff7bfba55cec88eda1528deb9e3fff20f5a5fd5dedb3d960
e848abfeb9ed31dca5e528d84acaea966ffe99fa7ec6fb02b6cb34fa61feca86df79c2fe
6ff2c48ff9a5fe81d9a914ed60dd6cb4eb88e542fbc3a5d01ad84796e0b64bfa10f5bbd9
0eed9531c5fc994cfa1b93edbe75e56bc998e177de64cbb779e0afc90ffb64f2be70b4f7
6ad89fffbd9be4b611e942a5f70484ff66f178b2cea3f732fb60f2b437e59ac1fa35dd12
d82ee0be08fb4cbfffd464e0c46dbacb52bfce89ff3afbc686df1cd87dfec145b0ff8cf0
a359f5ce41e017f045a2e785ff9bb9d843abfb25b5e704d951fe2fc852b6d85df4c1a0ff
0ac0f73fff96f179e55aee86f9afff14fb86d89fcc4c96fb6bd9fe9312dfc3abf0d944ff
d023b6fe06afff28affb01f69446fea5c1df1cfbc8e504b8fb1fc94afb63ffd170fecb7a
d9f3aae69bc0f41fe65add97bed96dfeb827df6ed786ee9df779fea6cc98e012a5fb1df2
a9e583ff07f92ac2e09d0cff96f160e21087fbcd78dd01ffbe25b9ee7cd892ceff61d852
f315ef93e070cef97fd38aed9dbee497ef1fff79e74ecbabe280d9ac12ceb624ffb0cb36
e667caa6ed2dff7be9c13fd0b55abef661ff3784b7cb5d9efad861ecce7bbfef7ad95aed
d06bf23d93eb994887fec77dea88f293d8379ef0ab21fe51bf17ca33fe5bd87efec110ff
42aed681ef93ff5af6c364bfda48e52bff61f5c976dc58fe16f069e49eed855af7afd835
a7faafc5eb9b21f75ad585d8fe68afff55f730bced1ee5aecd66ff06f2af30ed60fbaf40
ff11fa85e093d030fb73f358fe2bcafb6df7d89406fda3c793ec52cfb95ff104f8a0ff1c
f4d67fd989d1fe03f9acf15394fd8f4bfbd552e59effb824e481d9bc61ffb6ee9a51f53f
e009da78f9c247bfdd93e0a2ed88da85e093ed2ba5e480c9f502ff50ce1ee0ac3aff1aaf
f280d891d8af42ff86d094d88ed8b646affed03fed6afcd1883bff4fdebe86ed6dfa35af
e507c0e19bdd7aa5fe935dfbbb9cd7bf64ff87d822c9e57ada68cc3bfb6cd987df1ecd99
ed64bee13987f4d179f25aff08f784fea5c0da5ede86ec9146e526ee57a9db7ee02ac2e6
10c1f29b1dfeb217c586faaeff0cfcd02dd816e0afd49fc1ff85ec1ade89ff79f92dfb42
ff52f20cff61ccf76bfbaf5ae9bc90fab674fd96c7eb69c2fe51fa1ee594c1ed3af74ffb
31ff94dd17b7d993c9b623e5c09fed66fed039e0abed79c6fa8849fe0bfbc43ac0dd29e6
4ffe3bd9aae054ff88b7f648bafe9ec2f10cffa5b8fa79b7ff47aafec04b9fe025dcafe0
6ad819e54393fcb33ac6b7faa6ff96c0f331ff61b4ff79b2da3adfba6cf288ed3ad84d9f
e053a5f28af983ff25fa63b1cc51fe9bf20cd85acd6de099d2acc69ed8b646dd1bed9dd0
63dd3dedcb05e079b7fa0dacdd87ef77fc02afd97de0a7cb68f379fa61ff02f859ff62f3
0ad2b81aaeff9316c4ff53a2f2cc73d958f19ff96fff84db7ab6fa0fa0f36dec08cfa4e8
17ed4fade0c451ed44dd02d298db15edafff66fac23e94fb9df27dffcd21f0a5ff09d052
ca13e06dd888c8ed4bd0f867ff79f9d746e0a5ff93f4cc7af7c662dc35d05fdd93ed12fb
a5c761afe686eeb9ffaf1cf84afb30f386ff8ed884fe29f79ffe7aaff45dfe40d39aed37
ca4ebacfa5f227ffc106ecb922e6be91c2ea7edd93d983fe73f893f14bc1fb9a2bddbf1f
b3eb93d279e010d0aced09f4ca6aedc635dc80fa8bff68b1d786f73793d880ffa0f86af2
84fb73de2ed9b37cfecc20d54bddbe6ae079d866e085fe7bf79cfe4cf70793fb9a1eeda5
cb0a95fec55eca10be2fed9702fbaffe7bf1b64bbbd97ee02effcf36fba8017ad9c193e3
7cdebf05c4ed39da74e3c013c4e52cd6bba3f06dff7ab6ff9ef82dfe5dd863a2f981fe9f
cf4af233add829f045cda5dd3fe45eb5e073d0f678fd87ff3df825ff90bdf64593d8af40
ffb785fea5d85add32bef329ff98bffe1ce4c127c5e031d85ed088f2c017e45abcf479fe
af30f795fe49f59fed2fe9b83db5d994cde53eddafc633e4aeec8620b6f78dfed972ffad
d844a4e606fba5ff3cf75df1be7add6ac9ecf559fe36afff5e95fea153faa6ff4baefb93
54ff68f91dc2dd2fcef315d86cde86e593edbf43db58df79fec597fb6dffc19ffb1dbeff
9ec3fe0fee5ab6ea43d69bde69d8af38ec6bc9fe60f88ad422e54df019fe75c8fb7cdcaf
5be578f5af7afc86b5fe9ef40dfe519eff8bf1a53ce1c483e5b60fc7afc51cb2d774dda5
f01fff63bcf56bff83fa87ff42bff2d833de60afd03ae583f0c86ed886df70ca97d4b01e
f796fe4da329db8bd0f114cbec76dfafc70ccf94d961f2cc9bd980ec57affb9660e252f2
99c93bfa19ff93c4f72aebab0fd946e5b307e86df281cb2af26bd693ff09caa5f216aff0
86fbc19cff29a4d91de59dfb7ad895cc92e0a603e847cdf209d9c53ae653ed12ca4eaeea
92c9e945d80ed8ff9102fb5bffa3f337fb8eff4df90bfc79d884ed2aa6d908e055d86acb
fd9262ff9ff321fbbf5aff1d94ff5bf629b9ee07fe87e95bd810e5c5ff85f965a5db983a
f820fe82f46df123e6b439f50ffec593e504edafc0feaa09ffb57ed975e10cb0d45bf686
ffa5cb65f693d932e068d986e239db7ae586fb6cbefe46d003e14eceaeed7bffc35dbff2
31ff5bf73ff1c087fe6ba3ff6699ff86d9bbfa79ffd262dd33b9fb87f6b74ebfef93d726
dc79d858e2bedc83cf8fe551fb9ec3fe7fce9cf125f6a313e8afc74fd6b56dec95cdabe1
35edc39bfe54e0b445b9ff92f4ac724cd809c6fb54ffc1a7d25ce135dda5ffbe7ce08ad8
a645ff75d785ff2789d1e86de0c148f49ffb6bff98ccb753ee20feb74dbbffb2fa03feaf
f59efc51d81dc8e662db7eff95f36dfa11cc49a5ea01b3df83d696d879ffb523e0c13fed
bf0eeea53d93dbaf38f97effa566e05c94fbd060df7aed61feafee8627a5f160ff2cccba
18e045ed5ffe7ad374ddba5afb03f186ffc20ef745fb65cfb113e589d779faa4dd27d968
cbefde8de9af26ed7ae16dedba9afbb74eca06fa51ff32f2bf9ff63ad95bccfa41bbf623
feabcd30bded41e31bfbd181da71e3a0ed8654a6de9552c622afed8dffae34faa5ea57d8
21e0bf93fdb0f686ff75c2f513fc2de54bd0f480faaf79fbd170feb6f51bed97c1e505f2
ce1effc3299ff932ffc09cce0696fab6ff10e4c393f15aff86fab6da38e6afff50f9cc7a
d967d838e0a2bde58cbafe7bf9ac2fffbf16f260fa81fd1ca53bf458ff86d7b60bf640ff
16cd84fe92ed9fdc93ce86e01cc2ed93e57aacee66a2d888eb86ff7ccab27bf29331fe97
f23bd812fcc7f43fd0ff79f9cc32d94df397ce10b0f57afcb538ec5bde2bd852e33ca5ed
adc986fa9f52d915e3b92c9ed922e15ccb66fe26acd97bbeed79dcaded86d8a517f851ff
d955e07dd89f47faaede71d8a51095f2c20598ec2da5ff90f59bfa85fe60d209ed2bdd51
d0f269e59fcf93b8eb51c0fec79dd1b1e447fccb92db82f260e928d85ad324fc5cf76dff
a84afb13fec70ed8ff5bf916dd51e505fed750baedc009c4ff7be5a42c90e0b115ebb864
ff98e469d980fec63cddc086ff98d287f099f97dfed88b50ffb609edc394ff60f6c6ff62
f894beffa3d586f34dfe32aff848fe10e04ff2c593ec75b1cb3bf762febe8503c1f327ed
b8ff4c88fbd97cc0ed19e441cb1cd84af293fea1c886ff82b6ca4afe40ed09d099e578f7
03fe3294f2a46afe51d0be9ec2f57bff86ebafdf06d983e8b886dd53a4f89538c679cca5
f288d9659cfad848a7fa79afce47f8b6ff6cef88d842e5a902c1fe25f15093ffa319ed51
d909ff4bc818cfb627bfe07aead162fe34a7dd934c8aecae4add01ea4bfbc693b8e66cd1
93cbb67ffe6de539bfd91df38dc1e52eedc9fe53a2fe6ad580e1acc83caffc67d09ffe79
ed7dddaf35d862ebb53ced04fb88d8a5c2fb62ff27b54fe081edc41bc0e728affb06ff3e
a5e012f2c143a5fb60d221f3ca6aefd076e3b1ed9fff2bbefe3ceec31486ffd360e027ed
be86d80bcc49fbadf27cd2f979b1e086caed61cffa79e37bedc0a5fb94ee5fdafe0ef646
a8e081beef04d7f2c017c4fd85f791ddaf15ee5ac4ff07f35efbc136d0a8ff60fb86bcff
15aeda943f89eacb86db33fb21f759ffd31fe07ed95cdfafff13f7c295ff18f8d46bdeaf
f121ff569de07df2d8ffa0cd5efa93ff5fd5ed79e293d9fa69d0ad67ffcb7eef97fe9f34
ffb026fe4bfa01da57e06ad0af76ffaded931feda0fb8eff61f593fea5c71b94fe28b7e9
40bcfa0dafe02db5c736fbb626dd57e086ffaf71b3cb93ff1ef7d86cffb642fe9be53ad8
53cf31fe9dbffb2887dfaced20e3a4f40ab8d39bed4ace9ffb71ffb6f4aa16e552ed9fd9
79e0b963f497ff09f8c02fa5da80e357bee14f9afcc13895e484d2f537c5ad6abf23fbb7
35e078d99f56f8b54fc52ebbfe34ddb71ed93be050bfd982e093c1dd80cf86fb96f40dfb
b837df57caf8af4fc919d5b536de5de677ffd96aed62c4ff75d19efe83f688fea2ca69f2
7bfec205ce42f9d828ed5ecbb13aaccc79e062d879eea5ff7df186e56ed5aaf69643d8b2
69ff86e654fb2cafe47ef236d70bd95cd0f878ffbf6cc4f20d93edb346b6e25489fcca68
ff27fb79cdaaed2692fec44af818afd8fe10dc79f086dda5c1f708ffc925dd86fe99ee79
b1fb7af488ffc386f207fa4cf519afff31f0b636b9d97feccd7dfcbd40d8ff7ff653eec1
9cf22dd8b037c8a5fb0faded2edd54d864d913e54effafd837aaf789f0bd65fbc0a2fe79
defc21f3a1f90cfeb828afe05fd00aff3fdd5fccff79fac73ada72f18ac8fe01d864e7b6
f979fd2f9cd8a806fb3ba5febf33ffa3fb79cef39d4cf086d29ff20dff79bad96ee0a8cc
94ed4b87b5fad956e512fe508fe5b863fe9eed0fd84ae5cb03d84de2a117fbafe670bdd2
9de25ad868e0a5ff4df71f9ce50ba4e79402e09bd96fff0faffb83f79ff24bcf99d96bfb
93f405ffb9f17ed89d1afa87e64bdd159eea954ee508f2bf68b6d334c695ce68faca1dfc
a5da7aea9ffe11bfe51b93ec9ed624e058a5f388ff9c47a5e087c6ff43f4c295c6db4ee5
ca82dd15eeba24d8e602b6ed53afdd5dcafe59f50dff65fb78bcffcf3eafff9ed076edc6
4496ecce46aef66dffbf64f188fe6bbded9355cda3ff37fc79f388fe12e86ed888c6ff6c
d0fe79f2bf62fe29e584dcbf51e006db7bfe86f33be5c25daceb9546a7fe31edc05fd0b1
ff74c7fe32d0ff84db9d49d9fa7fff6ce345edbf7ae864f542f2b725b1ed6a9fcffe5af7
83ff94f9c04be023bff5d01ef166b7de70e25dff86fa9326f960d8a951ff6ba5fec733ff
cb82faaf1ceaa5ca8fde24d7ee0295f51dc84aebbb29fdabf31d87bee07ed9af22fbaae0
2ad3f940c4fe11f05edc93eb26cba7d093fb27edb044f2b751db30faa8d092c3f35afe93
c4ff60d320df5affb519ffcb3adeb6e079d388f6a5fb2193f2a95cddaf1bed56cfffaf0e
e650f0afff9f05ff97d88ccb85ff93fa3dd9f92fbce009cb4fd814ddb37afad85a91ff99
e50ea5fe24f0b617b0efd07ae986fec596c0f25f93e09e20f13fe397d57aed53bff2ab60
c1e884fb91f786ffaf79d969ffc5fa17fe36f49dd53f92f6b368afe474d87de0b50ac6b7
fb3ef64dafdd7afea3c826ec88cf5ae014fb42acd820eb43afe087edc09dcd78edbe81f8
86fd0cf74ee501dc6dedd739ccfb7de593c1f98630ed89c89fd81e84d0f452d92dfe0ed8
4be05bcdb679ed65a7fe90f27cfe6befc44394febc3ad861fbca7dd78dd981e05abeff0c
d83fe01ae43bccf677fabc86d86dff43fa15fea43cff99f955d367dc0ed843cdf105e3b4
4293dd95d05ee984ffdbc40affd01eedacff44f89fff6094d982c7f15ed804e45eff72fa
9aff7bf0bc94ff79f8c09ff117feaa36fb08f6a548dc20d86bd697cc80ff52c7b77cff9a
0af149fb3899e0bfa5fe29f587fbda5ab4e474edafe574f0c1a5f303ff93c5dd61d828e0
acd01affafeb04cdee84edbe32f750fe37f8a2fc3f9cf2affa72f592feb610d947d0fe03
e7c5a9bfd977e0c386dd2be5b9ffaaef7ce29c66fbc579f2d258f186fec00dbc487eedbe
86fa9a2abbcb87d841c0ed07ffb61bffa8f983d79fd80ede38afd34be706ccb668ff7ad8
6dcbf186e07cd0fb6dffaff356ff28f1bf9ffe14f54ce1b0c6a4d1b1fe16f645cbaddd3e
a5bff132c1fe9348bffb9517fd7ed8af45fc12f3b8ff993efbbb5bd880f78752ff1c9ee0
93dd73edbe01d2afe38651c1dda75bd87dffb1ed62a5f3932aed509df761fb0daffe8d38
9e5ac3fe22f9c13b95fe23b8ff01e53da0fad8affba452e762c0f26dfb17f3a7fb79dd68
e19ecb3dbfe623f48eee7ec8f66dfec3a5ed3add26e593f950a5d85bfe2eafe0c43fa0e2
8dd9ab36ed62df9ed86bf427ff60ed77d986eb72fb80c6ff138ffa9b18c5ff9f36dcc460
e334f19ebfe09a4386edca74e79efa38aae0c1add8fd57f213afc986ff6ef41fceff9405
ffcf26eca02f8ffcc34bbffb88ffcb30d894eac950d8f3d2ed2eaed85ce9afd96ee661a5
d96accee8756e11fcfff2ed8fe57d999d584e720d0a5f347fd7def9664fe52c640fcb61b
e4982dfd74f587fb5ed311beff1eedc395f00a93ecc115fa5dfecd83d887ee2afe93d880
da04cd96ff63da0ae54dd9b7ec69ddafe06bcff96dffa0bbfe86ea5280fbaff80ca5f52f
d489c1ff29f24a7fb4d092ffd840e95bdc88fba534d8ed4daffb6ad9b7dd18e29fdb7be0
07a5ed80ff5b93f1be0883b7f672ffbe88ff18f79fc4fa86ffac1bc8ff8af2769ee09305
b5ed35fe5cc797fe30afd86dde2bfbd986b4e9a5cd60ff50bbe08ad657d9c19ffface67e
d9a142ff62bcfb70ffb677e01ea5f80eff51c97ae453f2b9fe5be024d488fe79f8955ec4
ff3bf752f208baed2be74ed01bc2ffd822dd5fd6e554b5ff0be065d99ffedc05ee44c177
fb9dd727ec4fc2f282bef879c1f33bfe79f75fff23f659c2fe46dd1bcffb289bffdf61ce
b209ed33a5e0bf47ec28d849d5f89b34dc4cf8c95ef1c5ff79ceaced46df72ccff11f899
d2bb08c3f217ff85dc88cbfb62f21bff9c04f253ca38fa64f5b97de5d04eda37cbf085c6
eb6cddc096fbb717ffa33289f3aefb56f1a0d024c0fe02a5d886d793e05aafd479f593fb
a53bb7f292ffb76cfec87aed94fbb619c491fabb98e6b51cf37bffbf93e460fe27b2e10a
ace552cbbd93d3b76cb0e479d687f2af64c2e045acfe3ffad880d0fb5493ff7fdd79f294
51e0c1a7eab10efdb68648b0f71094ffb6f45792edae38ff5baffb6fd956f326edaf0bcf
b2dd79e4afce88ec95c1e001d6fa239ef2b1ed9926fbaf45ffb460e53bedcb71dcb5ecc7
3f94dcb03eeda5e07bcef348ff26fd7af686ffb706db58d3f684ca4ac51dee9c35dd50d0
40ea87f039ce52ff2bf9cc63d9ac44fe11d19ae652c8ff6dd296ea05ef40fec8f232fab6
fe52e5a2ed6df91894e69052f2b979dcc20ceeaffe07c0ff6efb1582fe93d831fbcbe063
e5d68502a3e2c34cbfe088edcf46e388d47ce06af893ff38a5f74cfe3cf724fe4cafff93
58c5fe850e88ffd269dd9ad028faa5d288aff95afd1b84c1f80effc286ff35f563b5eb9e
c7abdd1bd93ac8fb88e56dc608fe94f7af79cdf988fe7df5a0d662fe7add86d86baff005
e597cba9ed66c3fb7fb9ee20fa87ffafdf861693d89c0aa7da36ff12b6caf3d828c7ffa1
12fe3cf2a9cb36c7a4ed2cd0adf1d93be46dedbf198effbe43f1c8fa29fd86f669fa2184
feb8f635fe9fd042e15fedc886d87be0bfa7d090dd6bedb6e43dbff9d84bbdfe03f789f1
bf07ff4ef209e59dd8bced61d866e118bfd986e420c973fb4fbefe9aed8551f123ff97e9
62db2ad8ff02b9e022d8b013fba9c0e80bf2a2fe39c3ff79fa5af638ffa518f2459ce0ae
38d7559efab6ff4df6b9ed7ad072d6fd7a4da5fb9646e2be86e588fe6cf97de568b6f542
88b9c8a1ff4b9be8c3369afba65193dcafd80ccca5c0e09e1194d8af04ffa5c2fbac27ff
0dee9e49fb14f331fbc11887f0d460b8f3935ce0ab55d979ed94de81d8af4aff2ca4fe95
f391fba955fa96ff5bef0be66dcb5faffeadcba4d837aefbb5ed61bfeda25bf26affca58
e0299bfbb44cb8e084afd524e08ed880e0bf93c4ff6fcbfe7df4c230ec79e06fdc2bfe97
f2a73bd9ffc061efd66af3cb50d924e094d84dfecd7ad8ff5bfa03cfaff571feafea23d9
b7fe7b49ff9df35cff44f2b5ff71edc186da1881e793d8b76ffed996e47dd8a451d9ffa1
2eff9d12e7cd7cffc239fead38c1ff5ffbc87beaca44d825d077e0c010dd79d894d892f2
26f9d413de43fe7ff5dd863fa3fb8a49ffcf85e53a96f37bffcc6ad988ed12fb47edbf66
fe07f354fd64e811dc59b8e50ada93d0af1eff94cb5cdd03c5f78920eab406b7fe279fff
7ed358fc1cf0a510fb9e24e593ed61dc2cd754d986fe61ef13ebc384dd3ae5adda63d829
df49f75cfbbfd83efa63f5c134c552b7ff60e0f69467cbea79d8faa63eee1cebb369d8f8
9f23ed9312f6b67ae485ff5df73afea3c3fc2df841ff7ad8a176ef89ecc250ba15c2ffd8
10d0e49618f9a5bfe00fd9b948f11fffc595d8b674ff9fb9d29ac82fd8affa7af628a5ff
6bfc41f8ca62f084f990ff9f59defa6dd9ff79c7afe80bf6a3ec79cb61e0c052edafd340
aafb87ff94f809e475d080e093fb1db7fe9301c1fb7cf9a5ca96e0308bff9dcaaf2ced93
ff86ef1ec9b408cffd23b2f64283c7fc87d87bfbc51686e6d075dfabce4eff02efaae898
d979f15289e0afcaa5e458ffbf4aff0e86f9d99de55093f7a93cfcb3c852ff80faa575fe
86e5af5bfa2bf4ce0edd42f061f8a8ff4b99d889dfbe47edaae06abbe53bd81ed84dedce
80aacb3f99ed32fa60dcb63ab9ff9afa81ffaf6df979ffc715df5bec7acba1f427ffaf45
d3a5ec61c5ed9033e9bf5aff1daff2b84df112ffd55de002b0d199fe7afaaa5ae56dd9bb
fe28afe04cdc32f2b8ff47b2fe32fa6cf18bdab741c60ab6e530bdf39a4dfe02c1f31ee5
9ccdafe19431fd71f3cb66edc76de084dc27d75dedc334d8be3cec7dde9460f77efe86e0
1bd978d0f235ff62fbd08823bfff11affe97f386fbad0fe52dfeb0f786d893d083edabde
02d539d81fdfc206e8b767f3afd01fbfff3aaedb5dc9f76dfd2eaff74bffcfa00fef86d1
fe6dcde57ad984b3f99fc0fb4ef23edd33ed87c3ff068ada9bf871ffa8e55f8ecbf36abe
d698e41fd252fe93f8a6ff5ad0ff14cced78de81b1d062fa34f451ffc0afe027acfe20a0
f609fe67f5affe06db9ef96cffa1cb51ffc2a6e72dc6abfe93ed01b6c6a2ec1396f4c679
d99fee59d068e034c3fe93f17bd815e44cff1afb52fe88f484f296f363fea3cb28e29a47
fca5f159b9fb86f39a08d894c0d979deb76dfbd569e0a543e80ba2fa61ed24cb42e475d8
86e5c49dbefb43aff2d051eb16b7c90497fbc10c9fe01aff4aadfb93f378e030d882eca5
6bdd80b7f63cff4beeb993dd7bd66ddd0689ffd85cc5e77bd29dea944ac0e461ed19b2d2
03fdb123ed48d0a3e55ccd43c0ff86fa50cbafe057feb04ffb85d907ffbf9cf460bf47de
62feafc87ae09cd826c95ad9b846b4d731ed7efa73ffca85d97be5cf16d840e6baff51f5
0fff9e1de444acfe28f7c780febe39dfb6fd7aff93f629feb662ff17d693e061a5ff85d8
f55bfad045edaffe7bed85bbd95cde28caaffe61f41ec5f748fe25d69fbed884fc05c1fe
23f2a5fbc54a93f2a53aff53d91ccbf183b5fb93c2f47aee59e3be86fb6eff09fa7af6a0
5ae421f187fe6dd803edc12ee578eda652e721b5dafa8aeea05df4b735f266f975ff19fb
a5ff79f693dd39d9be0ef42efe449ef07affc260a5ed87e067cbfe89f3c592d97abaed53
d0ff8f4ba5dd06cd61edc10beb80d971ef20fac130f24c93dfbd79ff87dd37d862caf508
ff74beed0f9eda90e07eb6d89eed88fb11f731aee3995fe8b34680edafe50dfbd992f286
fea73dff25cf51ff33e091d87ff3cb14db90edafd91debcf7bd961d831eab5fa74db97c4
fd42ccfb79d1ff7d01cc39c0e609ffc691dda5eb93cd76dd0fe1ba49b6fea560e093d889
c6ff61e0ab1cf9c62ed749eebd39d97f14f151ff0799e09316f1c2f769ed82e0a154d8af
f83dfeabce78e793cbadff2c9fe921d55df7a5fd3c88e0c4a3f969fbcc38ff4dfa07ff67
c75cade086c9ff4ef8ce86d8ffc12bfa61cabb65cf2dde60ecc779dd88e6a2cc64fa1bff
3f98e9b650c63a93ffbb30fbafff80f59f4b93e55fff15afdc930ef29f41eb98ffaafb7b
d99e59fe0ed03de05bed86d067ffa1f00ac7f979ff4bee04b6d831fb89da82fe90faa979
f993ffcb78dc9fcdfb37f9afd8871ed7afff37f7aeff5e93df9f5affb949fe0ee564bffd
6ad97cecc011d8afff9533e743d1b779edafc9a5ed93e41efdd139eb5793dca535fe1691
e0a6d395ff36affe9dbcfb13affa43f3af0ff19ac1dd75b9fe6bf99ffeb2df5596efc50e
a5e119d2ffc223f3bb87f750ffc880e0afc7f15bd825f24abce587ef7afe9ffa2efdb3ed
22d85fe0983aedbb9dc0fa77ed95cbb752e56cd90bc7e623df4cb3fb2ef461b6c669ed3e
ffbcfb4999d96ddc14ccf11fcbec03de99c4dc7ef1ce0af2b5fe2e9afa85f059c6fb7cb0
f219ff9724e65acd3baff2bf75ff9ff5d11bebc36cbef451fb1ae479edd701ed4ccd9fe0
86d87bfec05dff2faef0cf09d837e518f280fbc24686f3d876fbb83edfa5d047e197edb6
62fb26fe6a15dc7fe093c9f62dd84dd9b416b9d8943da7f78bfb7dfeafcc15f862d2af4e
fe0ff5d025f19dff9360f2c2a5e47ed786eb23fea5cb80dd5093d1f223fe86ed7abeff6b
b6f686fb2ab3fe4396e0a54b93f4cc50e226b7ea04c0fe86dd5ac6f78afe7bfbd88643db
b80ebe61ff79fba4ed7dda86cc4ff7b674e16bff8ef645ff07dd36d9a5d193fb489ff786
dc7bcf6ad805e8affe9a39cd5295f67afb81ffc037d118e5a3d692e0ffa5f853ff1ca9fc
91ff86f2a5f56dfebeda4ccb19d952e66cdd82ed26ffc783dd71b2ff5dd83bcefca042ff
04f158ff94d85af20afb9fc2e910b4c8a5d72dfa46a5e035d055c0ed79caaffb3bffb8e4
60a7ff7ecffa70ade03ad86deea645d819dfbe04fea8f069d8fb91c0df3fd804ff3cb8fe
a1c626ff90dac022d1b679ed87fb6df61eeb63c7e15aebadff4df8a4ff6dda5be0adffbf
ed0cc84dec07a5fe83f5c15aed38bcc53db5d287edc04fcc03e03bd851df07e977ff9ff1
87cf30ffa5fb52de9d3bf2a5fb42bfe487ecb015bfdd87d89bcc10dd78e584d8b82ffa79
ff80f45afbba98c3fb85f392ffa54bf916ed72d188d901edc71ddd9f44c2ff65f6a0fe0c
cefd79f3a561e78ccf28ff964aed26a6f266e1c497e711ee87d956ed36aff27efcbf4acb
98e352dd83ffaf12febd2e93edb63eb9d72bfa8bf22686d6a5ffb66ccfe66edaaf43fbab
f867f293fe0ce562dc96f3bd6dfb7eff86cdaef226d661fe96f3b822b3d886e8afce1fc5
ea8601fa62fe94f452f732fe64f6affe31afff68f096db50e03bd089e552ed08dd50d91c
d5e585d892dd27f261febe81f279feafee18dbb729b4dd85bbe04ec8ffaf55f9b67ae5c3
99fad881fe9f59fb75dc61fe7afac19ffe51e410efa5ff1bb0fea8c938ed96d274fad823
e088ed85e5c007ccaffb5ae532d8f29c4ff921ff95cb05d09d1ed96fd883fe28fa60e79d
c3ec1db7f85e96dc81ec01df78d891e50bff5af77aff5ba0fed8a9de2bd86fe0c17aafe8
9250c0efd043e5c602c4f79fbeff0caeff87d37afe9ffa6cb0ff40f75bff7cd8ae3afb52
d90ce073d88af182fa4bff309ffa9330f1d80deccb35fe09b953cb17edbe2ef3adce1ee0
a60ae570d688d862e070f2d98b02e5b660ff40f1c265ff98fa13fe4d9fff7be978d988fa
931dfec886d865de7afe5beaffa7f751f1bfa4cfb841ff2dafd4e537c5ff50faa5c959fa
3efebef26dd519e092edbf35c44b86eeafff1b9ffbcf19d8fa9d1386f3ac78fe61b629ed
74e3cb3ad966ebc030b8ed0fbcce9ec7a7e718e295c0e886d593ff39fb4dd599ed6ac1eb
14d0e265a5ff9a5cf379d3ff93f6b279ffd88946ffb568ecc393f521ffaff929c6b740d0
ff58f8cf81e0ac0ab4cb50afdc79c7ed62dd30ff16f14ac3e2b83bedaef331e5b0d887c7
32b6e19543ee12feaace96ed6993fba40de0bf2cffacc1eb8548a2dd86fe58d007fd93f3
affbc64696d2ea4088f3a83be4b4ffc529b9e193fcc295f94ba1f293fd1ea6f27ec3fb61
f306fb48b9fe86f020a5fe2ff35ccf9fbee51dcaa9dc6effb97efbc542bfe08adcaf47e3
33dec2259ad0ed79c9f54dff3fafdf9b39c99ffe87f769beed9327fbc168fed986f6d137
eba51bf8add198c9bca1ff865cfebf0c9fff9027fb4af493fb04c4ff88d886e275f70bfe
cb44d8f5ae6be563f21199dab5fe37edc29ef5b578d863e00d81d9fa68bbffd85bcaff7d
d94992fad615d845e01cd7affe14e05fc9ff4ce338a5db81df79ed88d04cc3ffcd61dec2
9aed0eff87f85ffc02f49c44ed21d986f81aff2fee86c0fe6af8aafc07b7f92f99d984cb
fb6bd0fb7ae859d816e0a335c2dd9e1bf3b849e21f9ffe5ffbcf9353fe3ff755dc02eda8
d973f1d878d2ef9ebe62de78b0d967e54bf219d855dd63afea8952c7fe93d888cdff2af1
7fd0b126e245cbf821ff9dc1ffa426f19009b8fb9621ed6be7c1559aff7ef56ffe68e685
d28cf7aa78d98dffd123feafcc1efa6af6a44393f2a850fb79b4d846aedf93d488e5c3ae
fe61eeafd570c9a9fb01afd941ed5ce570d0aefe15f3a503ed55bedd0af275ff7cfbaff5
79feaecc85ef79ffc683dfbd42d8f2b6e084eb79fb93d024fbb339f951c311ecff27c1fe
36f89fc979fb88ffc093fa1dffd99916ee33fc55bce0aa08f689ff7cfb985fe7bd4df239
e5bf58c5ed934be0c2a4f905feaff05be9c59ebbcb38fa50d928edb80af5539ce6943eff
be99e010dcb5eb03ffbf24c5fe69f6cb2cff51d917ff5393e0a33afb93f552d09ee980d5
86dbafff51ee7ad865e0ba7eff26a5fe92cc95d952e10ed84ce53cff0ed8a645f4078cff
af7d0fa5fc20b5ca35e8be67e59acba8fe89b8d1a3e87bedad20ffb63eeda52df25fcfb6
36f9ce7cde79f2904cfbd8b64ab9dc16edadcd79dd84d86df9a5fe33cef780fe40bbd386
de1fdbb42eff08f3af7eed98ff5cccea93c7f261c9ef64e534afff83f96dd07ae09fed3c
e4bb73e885f279ed86d9c107ffc25be50ddd79ff51fa12ff942bc4dd1ce4b6ff48f7ce92
f0d24cdc32ed21d06fff96ed6dd89ce77bfbd46bedc4e426fec4ee67cefe88f87dffaf4b
ff09e057dd3a5dfb0ad04ec2de84e4cb6adbb3c79ee57bedbd5affa5d51fc1ed943efea2
f26ad556ff33fa13feb4ec03d861e0aa0eda69e079f148a5ffc062ed93e06aceff10d886
dea54afb32b6ff14a1d87ffec961d82fe392fb55f487d1af06fe9fce20c7b2f637fab56d
f29fbaff99f01fc7a4ed58bff361a5fb8f3794da9f34e577b6fb6bf7affd81f1c02faffd
86f55dcb21afffa04f86b8d98d38d8b050dd61d90ef2c493ef7ffa93f3e082b5ff93f561
fb08affe15fd4cf604ff4b95e4af41f7a8ff65cae86fdf0cff88d97be0afed883ea7fb8e
f27cffbf9ff529ff99c4e4358dfdae42bffb31b8da59f925febe7bdd83d9aefb28f2a546
f3b8fe5cd92ad8ac14fe5cf1c33efba6fe41a0dd7cedce26de46ce61c5aee06dcbabe37c
febf4af1befb1dffc15dfe13c3e5a45ac1df429efada01d032baed88e030d9b4fccc48fa
a7ff79f318ed87d76ce02fb9cf20d97819caed61dd2abad29ae686ed93d979e0a4c1fb0d
f0c286e103d9a21ff9be97c3ec29fcc16196d9b7e04fcf25d64ded3badd8b511fb74f4d8
0dd1f97bd8ad78f0a4c2e56ad0ff01f843cf5ce071d1e5951c9fe9aff779ffc098d8b57a
e065d880e0bf12fe4c97fe88f47cfe2df74bfe25f53ed908ea9cd677cbb16bedb086f296
2bd8ff078efed28861bfff8ff948fe96f761f10495e56ee009d3bc94c5fe41f8adfb70fe
a5c0ffedac40fabfa4ff4bf238d856d027fbaf31dc82d46cfe2fbffa7cffafc832fb4ca5
f39306c6ff24f96dfe9af586fb93c4fe51ed93d0be4d94f69e51ec03fec43aff1a95f52b
b0ed9bbafe93c0ff0587fcb6f5860cc4ec4ae137fa22ff97f30bf957ff94cab1e75fd80f
e4a5d882ec96d87effa2cd86ff0ef657f2d307e0c547bfec60c6afe7a51cf7acf05ab3d9
9fc70dade47fd8ff28f6be99fb4bff2ea6e09115c1dd34e4499a64fe88cf14e080da79fa
7cff9be084caf961ff29d993dd9f4ee637ed78da86e5b969dbabed55e59fcb16dd75dfb0
19da86e06efa27ffb1e068c9ff8adc84f3b26dbfd979e064cb77df11ed468df4cb38d950
d2ff9469d886ed6dbed733afea91d171e53ed91eefa5fcb939fbb605dd54e6c064fb3bc2
e093d92ea5fe7af8a6ff89fb7df256caed4fd827e5c817e65dffce34fbbf69afd052dd73
e3a1c1f552d2ff975ef687fbcce52cd998f75afc1ecda9c611f265ff52a5e493ee84fb5b
f3cb93d888f75dfe19cdff36fa86d4b941edbd5aff33c9f75fff04c9a5d884ee1afea721
e562d052e5c8fb4cfe9ff33bff58f6a5c6e2b85aee7bfeaf44bffb19ffc295f766fdca52
da2af2affb79ffbf6bcc86e072c9ff88f2a617ed93dcab5ffa77ffc753d831d70cd93cdd
1dfe6ebcff80faa551fb86f1be79de9d43c5ec84ff32f7b820da79ed9e43c6ec79d802af
58b7ff65afea86b7ff46f088c0dd1fd3f410c652d01ae0a808ff51dd10cf93eb9f5ce1af
1df58aff81faa5c0ec64a6e97bb7e54af237acd65aedc29bf725ff9f0893ecac0dbed893
d4b766fe1f80ffacdd26ed9fe57edaaf47d907e5b67fff98fbc1018be0a54af823ff5af4
9c4dd235fed97bf823ffbf13e9b683f399fe81f668ed87d385e01199de6bd0ec6ad9a124
f388ffacf90ff25eafcc81fe8afb04d8b9f21cb6ff93f1fbc80befc632d4ed63e09ffe43
aeedba77b5f7a0ffb77afebb70eba5fe79d842f4c880febf61e310d94ce00794fbd722cf
fb67ff96c2ff8ada7dfb3eafdd79edb6df36d6f686fa1afb2eef93c4ec960fc3f862de0b
f25afa92f1a6c640ed18e44c93eed036f2ca92db9fed15d9bef986b745cc5be479ed9fcc
47e11add4beac09ac3fb51f4b5fbc53bfe09baff34cbfe51d817e062d99ac2e611ed45e4
63b4ff618ffdca4ade753b9ddf5193ffa006f8b524cb80fb8d38ffd846d92bc6e938d8f9
c23daff068ffb602dd4bd1ff7ccda4f37bfec34992f29c38ddaf17df50e908f260bffe87
d72ffa67ff89c247b6e59cc0d936fb4cc0fb6eb5cf91ffa5cb2dd061ff86f99ed86bccfe
63abff9b0ae97ad869b1fe8f11c5ed95feb9a5d841fd6cf888fb6fceb020ff2fadd99e41
8ae3af86f27aa6e081b5eb7bd593febf2afb69ffa5d09dc6ed37c2e52a99f8afd8aaff7a
f6d879e5c872da93ebbe02c5e29a6afd8bf25e9ff5912598ffd11ae0c186ef9cf89439be
fb30afd83defb8ff53c0ec7acbfe86f879b9cea3e318ef5ce797cbba59dafe7dd05eff87
b9d89fe084d931fc3dc667ee95feb71ee056d984edaf32bfdf5ac6fa52ff29facf41efab
ff60e508f42ff186c2e027d9c0a5fe65f2c686e503ffb7f721edc14ac4f658fa08c1fe59
f038a4e086d9bf51fa1eff5aadf46ed5e3860ef3e123ccb01afb41affe36fa4cffa7f251
f9cb06e078ffd34cddb5ed6193fba42dfc54d823eaaef168c7ff6fe09f15d8a6fe10f746
a2d82baffa39ff54d97fffaf46fe1af0a50ded42f2ab05e853f119ff5cf297d8aafb13dd
59edcc79fc2eff0ff79ef319fb7eb7e296c7b886e079dd2cafd889ca93bdff02afff943c
e406deb84efc93ee79d862dc79ff97e61bd892ed9f27e286cbff60f13a94e97bdc93c0dd
08feb244ffcf6b93befa6ff1c297e868d19fdd6cd886dc2ea5eeafc812aefb81fe0bc9f3
46e6bc79e485fe6ddb0ae1991ded87fecc67e384d98abae76df0cb86d881edafcc06c0e0
8fd879fbc788d97acdf985fe79cfa6eaaf02fe4dd5a1bcf83face687c8a5dd6fd886d693
ed25d06af550fb1dff80c4f24bff3ffb51d09ff24cbaf786fa9c79e0bd44b2dd32fe9fcb
2ad861fb70ff43dcb973fbb001d2acfed80bf3ad31fb63edc17bebbe52fc2bdc4de4ba5e
fe10b7ed16bff41efe63bffe8844eb99e532ce5be47ab8d968ffca35f2afc651ff7af6d0
5bd92aabfa43ee31cdfb01ffbf58fe0ff6992cfba2f761f22be94eafff26fd3db0dd25be
fa3a89e0c179e588eb27c79cff04b7f262bcfb4aff3cd961feb3ed03ddafd657bdfa69ce
a5d89beb70de66c8ed61d83acbff18f5a2ff68f1bf13fba8f28cb8cea5e56bffc846ed98
f82588b6fe50cfed83d8a94ef91895edc2f786ffa530e07aceff86f85999e0c3a1e45cd0
ff81fa6fb6ed93bffb24aef50aa5dc9313faa3cbb63ca5ff7ff7c67cd895ff5da5dd9526
e39dd96bcae576d938d085ffc193e06adec298f467aee37dc9ff43f7b72fff5bfb7bf167
d1fa3aea22cba5c0ed79e6a54892ff9b65f29fe70baffe1bf726affb15feaf23ffa5ee6b
b5d861e90fd6af7aeb5ce13fff05ed2fbef411acdb7edf66bfe558c5e278baf615ff93d0
afff3da165d913d0fb93f5ad51e079cbff8b40f70ffbb920d83cccf41aff47d89dec83ce
fb4effd079ed29fddcc105eab657ff0ce078c7f34db8fe62f43ffdbd52f295fe71dbaf3b
fb13f4b650e408d1ff48f212afd87dedcb84d893d91be3b26ddc8bff79f507b5ff13c2f9
d55be3c12ffb8bc5e26ced94c0db88d87fe596cf0dbefe28f99acb86fb37f8c093bccaa4
d893fe55cf99fa2dfe4bcaff77fb2d97ff24a4d76de036de60cde5fea5ef874bd905edc5
2bfbaa26f0ba7edba573f387feb068df9fd070ff54dd3b95edab5ede89d89662f18fce38
e588f2b0f92487edd282de88d0b412ffac20bfed02e59ecfa9c982ff86f8be76b6d694f6
5afe1da8e20aee72fec043fe9bcf58dd96e084cd88df2bb0f417fea8d04cff2ab8d350ff
36f656f139dd78ea85cfaf5aed40e4c29fd049ff0bf465f95caedf83ec69d0a7f3af16ed
9fc1f26ac4fe49f39ffe81f2ae01c843b6ffc86dfe619fdb83d0ea65d6ff56c7ec4bdec0
03fdc42df8b506f192ffc11cbff925ff59f8bf44fea1f475dd984ad3aaff9f39fa1bafed
77e05fc5e551a5fb87f360fe43eb22dca534d9fb61e72cd887c5f96bfca1cc3593ecc40d
edb632fd53f331fa9fff68c4d97adf86ed7db0ed86e67fe079cd8afaa7fe49f53cfbd992
ffb01ffe6cef9be583d630c2ee19ff40bdf20c92e786d54de004b1eb7ed8b80cb6d827fb
8ee580e91ea6df91cbff4de60ab6fb33aee20796f8a06bedae5aed79e5c97ed85be587d9
6be2a8c90edf86d923affb1bc0fe6bdb0bc1e07ac8ff30f8c193f17affcb6dd823d986d8
7bfa60c3fe930ecb9fff6befa551ddb04af3afff60a5f980fec87cd991d8b943b3e4934a
f63afd0ec0f943fe04caa1ff11d9b828b6d88ee072c005c674ed93d825da4fb6ff99fb74
b5d693e479ffd85afca5f893fdd938f760fb93ee70e657be33fe96c2fa47f32ea9f293fe
80c995f479fed82bd0ff3adb93bcfb42acfe2cfa9ef444fec378f39dfcb660edca68d8ed
2dbfee86fc4bf5b662daad43fe0ad7b62ef55cffa0f70eeebf98e653edb0f342afdd04fe
ca32ffd586d921e0bf47e41e9ef610ff67e585f105fbafcc94c9a5e06fd99bbef330aded
53ff99f260ff1cb5fe95f7b753f586fe7efacd1cd94cc7f761fb21ccb33bb8c726cc42be
87cdafe02cdd47ffc39ff7d8af5bed7cd888e0c01bd952e016ed4acbb664fbbe85e579ff
1ed097db6ae0c617aedc9305ed4dd831d0ff954affaf79a7fb5aafd793cf05ee79fb91d0
a0fa4cdd84e4c243bfe0a548fd18d86eda79fbc686e5759ced9413f756fb79f293d3afea
51d0aded1cfeb7d961e01fff54f430ffc462e577fcd084df6de302d793c7e94dd82fe5d0
16e03fc8b067eb7ce59e07edbea2ed65ddff86f37bffd85bff1a86fe9bceb31ee0860ff4
bf3cff0afb68ee87b0f67bffc09fff1fedaf46f616cc9ef262fe0ef6b179bbfd6ff7bfa0
ff7ffa9316d7f2c302f9d93bb9ff25f28affa5cb21e461ea79f2a5fe06affb5b8affcf77
f2a3ff27e49d1dff4acffa5fc1e57ac7a8d72cfb61ff78befb5c9dd89050a5ff80ed98dd
6ad8a418f240dbb85dfb20cbaffb7bed5aa0f37bff618affbfa5f303fea5f638feafca51
ff2ff99f14d84fe0af09f298c1f1aa5af57afb6affd079e2abcea2c6b644fecd26dba539
dd88d886e094c9abec4ebfe287edc03cffd855d429e83eafe064bde6a53686eabe6dcfed
7dd8aa3ad94fecbe99ff16b7c726cf94dd7ce5c43393e2b03cc9b65ef1d08cf3a520b5ff
3cb6fe10eda0c1e101b5f024cbff43f9c6f214d8bb41b6fb7cf7bc86fea10dedc398f344
a5de2cffcd0de0adc0ed9b5ce488d9b647b9d887dd79e092d978c6f193fb77eda5ca63e0
34d9bf04edb9da519efe19f755f234ffd99d5efa6ad0fc77f95af311ff60fe85faa534d8
4c9ee89308f197fe86cbf211c8f456feb6fb9827ffad0ef661fbc378fe86f73fafd8fb63
e15af23dff1cf6affa01d2fe68d8febd41e87ad9c0f067d0ec85de7bff5995f5cf80dda4
6cedbf3493e67afea5ee07d14deacb6bd8ffaf4aff88c1fe65d879b9fd9645fa0ecbfb2a
ff79f095ff10f248fd17f24bfeb65bda1fd03dfe4cf793ff6ffad1a33b93efdd62cb83dc
95d89312bfe085ec04afe424c779d0a6dd30d801cdff7afbc35ffbcc7dd969e0ae5dfbb5
2ad87ade5dc5e253dd9ac0df1ae4b50adf6aceef5094ed85ffc09ad5b471db7aed569ff3
8f1194fac108ff4c93dd9e2afa4ece38bfdc8847fe3af7c30996fed04cf626e086d993ff
9f23fa4c8ce083d310e637f2a7f73a87ecd06ddda551dd60d523d86fe383b5ce9cc5abd0
05f79fff85db79dfae0db8ea4387ffb6f92888e8a5ff28fd51f9aff53bfec196f259b6ff
9ef853c1f17be788b9e517f2b626b0ff41f619ff99d96dff88f60aaffe86f38cfe41a3ff
7bf6c19cff2c91ffcc34d8ad13fa4defba2dff93c5e630deb5ed62a4e086c9fb0af2b0c7
97fda5f822ffc2afe076d9afe15fb4d99fc768ff5bf038b9de93c6f534fab9f07bdac016
dbbffa1aafff83f8b981f587fea9f93fc0f65bff3afa8aea6dcb38e7b0fa2ad6fd67c9ae
e313d878d4fb07f05ed07bdf86e579d8a54bff86c3ed3fd80be26dafff46f9289cd983d5
f866c3e08ad152e939cfa5e551c2e03dd013d869e9c95ad835ed4cabe2be0bb5fb6ee691
c5e56afecc5ddd17a6f879ff38cdfe58f437afe07eff5ee506da5eed69e61694fe2cfb87
f31dff79f2bd2ce082cefb5af109a9db9527a5fb4a9aff934ecaa1e140d820edd009e4c1
32cba4df24e586db7ce02dff86f2c20f9aeb7cbeee21fe60f394ff4da0c891d99ced02cb
49ff1cefafd82cdc92f472fe96fb22b8d76cc4fe61ff3997ed11a4f279fbc387ed20cb9f
fc6cf77aff84f91faff08ffe81d0f478f9d968c2f14afd32a1d9069cf783fecf51d888dc
af28bed09efe62d226d877f2b0cb93d4aaf2bf54e8a73ed7b856e501fba7c1fe13a5e87a
ffcb50feb5e073cbed61d5f271fe66f38cfe66a6ff9d5cf36cff7afb9ed00cef56d8a4d9
6193ffd153fb44a0d88cdec342bfe1fe52f61ffb6dff93db9ed083fa6cb5fd13ace0bf4a
c6ed7ee0a2ed3ce5a5bfdd79b9fe2ed89e03ffb3fa64ed30d9a5ed46b7cc97ff43dd02d9
af1dc8469ffe2298ddbfaff286fbbf3bedb779fc07fa65f295fb78ee17d986f793fe9f41
ff10fa4c86ffd06ec9ff79fbca88d86ee94793ddc041d8b679e580f259ff1fb6fb07afd9
2bddaec837e5c346bfde86d914d8ad46ffb68efe79f51afebf3ea5f188caff78f92fa7ed
98227dd885e0acc64deb35f55ad907e9cb67d8fa3690f2a551fe0ff75db1cc06fb4effcd
65de6fecbf8048a2dd88ffb81db2d8f256e488cfa5fa6dff95fcb0e57ad0ff8709fe61d8
51e0a9ca22eaafc79de019d844d95ae5a7ed50dd1dc0ed80e59ac5e01fa4f70cb6ed2daf
f83dff7dcdf762ff96f91ded3dd603d888e57ac7a5ff82f69d02ffb579fb94f61ffeaff1
66e5c462f3c122ce96e05addb1e518ddaa03e05cbcff6bf7cef238ffb430f3a3bffc7ce5
8afea445ffbe7ccfff17e5c09ad093c1ff7bf288eaa535edafff42f7d9b9fe14d34be086
eb9308fec426f260bfed51e05ed80ff2a542edcb81e824ff6bf57fff9761f254afff85f7
a5ffb935c5ff7cb6f96cd9ae2bfe61b9ed7add68cf9fe06adca5ee0cafe024d065c98aff
86faa8ef3bdd4eed37d351c1e97df1cb0ed958e0bf4296fa02fcaf31e4a5ec44affb7af7
84ff77f5c680edcb0ad957b8a5d979cdfe60d912b6ca28f252c1ee9929ea51abd986ff37
fa4bee1cdc55d91fc1f8930bcab68628f18ee572f29cff5afbc067adfa82e513b3d826f7
93fe65c7e4ab5cfa9ecb8ed80de147bce52efece3adfbf02cc62fb980fc1e02fd74affc0
7af3d84bffb2fa45f416ffb028d29bfe55b5f59ffbb454ebc45cbffe89f87bb6fe93fa2e
d647afed87ffa379edcb73d988edb879fa68ffc705d830cd4fd835b6fe3b9ef188ff19fc
4aee0d96e581f068ffa5cf93e01db8f687fbc95ef16ad8a5e280d39dfebf95e24bd2fb5d
d8fda7cd58affbc301bfda2ee09fed51ca9bff79fbc567d33aec9629f7d819df59f9a5fe
86cef379d9bd7af65b9bed92e281f3affb66fe88f279e9b50593e49a2290e094d882c7fb
5ef184c2ed3cd812e0c02f9cff22a2d813e5cd1de061bafb9fff62ce33d6f918a5ff54d8
3affc912dcbb85ed9dfe8cf294fe86d0affb6cd893c9bbde86fac73bffafd847e40cff6f
fbd457dd079ee024b6f50abfff34e0872ffb6dffaa7ae4993de50ff3d83096ee61a6f780
ff0db6fe2bd2be389fe982db72ffb878bdff79ee2cc942dd9f1bffa50bed8bcafe48fa23
d640e54ecbade00bd238fac7fe3ed2fdbf5afe62f33993e4ad32d988ff75f25dfeafdd83
cff562ff569ff2c29bed78e01ed993fcb155c2e52aed7fdd9c5ef0a338f855d769e20bde
62e51ddb4ce52df67410a0e65aa7dd9a1bfb93bbf39fc73486ffafc1fe7dfbcc88dd6ba9
f079f6afc5df14c7f424ffbe7bffbb62ffcb7dfec23cd05bc1dd7aeb52f4afff17faa8f0
01d0fb3ca5d495da7beb6bfdc658e0c161ff1ca8da6db7f190c7a5ed269cfc87e29f5385
eabc78f0cc04d999dec019ffbefb05afd893cd7bf408ed4daae082bdfe8642ff0ec951f2
6de707f298fe7aceaffe09f8d286fdcb72de25fba0c7a5fa54f67affaedd5cedd8ff34c1
fe79f4c27aec61d240f1aded9447e42fd8a540ff5afbc74cd802ed4f8ff19854dd6bedd8
4e93eda441e021d995f0a5fc44f6b1df6ad986d8b645bbe09355c2f30ffb50ffacf133b2
ee80fa9fd0aff486fec652ff08f67affcf46d962ffc4f7a515e03baff67cff52fa98d84a
93c7f448ff2ae66bd695fec733eecb09dfafcf95e7b686fa9fd26bdf39b9fb5b93ebbe4d
e529b1ff91eeaf42ff29cbb796d2bf149efe86bf69b2ed04d340dfb52afe8dfa79e003d8
f979f365f7ba79ed169af986fe9dc0ff60d0feafcb05a8fbcf1bd6fa86f46cff10e06dd8
931ca4fb05f261fe87f631feafec7fd888e0bf03d089fb40d925e54cec36d815a4e494d8
5bddb971f8afeb17b132d8fb7fff6cd8b625e586ed72f8db62a3e480daa5fb52dc198ffb
af79f98dfc60f439ffc626dd47ffc187e40fdcc44393fec27bf210d861cef382d972ff06
f35ffbcf3ee421fbd081f788fb6cffc859dd18cbb0fe6db6cb9cdc09e6ca87d1eb2ad8af
44e927d9a51e83fa8bf239aefe73b6c74be5bb91c3f933ffb8ed7ed096e11fcc9bdd61d8
20ff4cf831a1f55fe394cdafff7bd886ff69f7d33aef6efea712edc12c97f5cbee9451c8
9fed33fec35ed30acab026ffce0ffac41ebfea7cf2c1d923e350d625da7dd8a55ffd8fed
a51fefa9f577ffadf119a6da95e580fe1bbae44beda5d88be6b379f9acecaf45e05bd995
ed08a5f7bfa2ff4497e720fe3db3ff9337fe62b0ff72f4c494f86afbb6e047dec485dd52
eb09ffa8cb2cf24da2e078da4aff38f95cb7ff4baef27ae4a4cb93c2e580ffbf11fe4e99
ed05e196cab588ff80cf2ac1fb9357fec6873d82feafed11d0b277ec9bfca5fe5af1b686
e0699dfe9337ffb74786ffbaf56df1b5fe12f6cc80d85bcdfa9640cbb630e05dd1f93bff
49caaced5e9afbc03bfb49c624f1be64c579f1aaff1ecd50d8e98639ed6adcc25af2bf91
e078d5f29fe533c0e011dd79bbe53fef8cffb52dfebef693d879ed80fe96eabc0afb88cb
a5d989c6e979dfc10cffb864fb17f051d926a9e668f2c76dfbc028ed47e00eb6fa99dd40
e0add561ffdabf08d889ff65f8bf18f245dd6de1c24afd34f6bc46f1afd06ff9d894419f
d9a54593e2bd3fe601feb671d7ff69f7d984fe9c79ed86b4f95693ffc20f86e993b9ff98
d138ff0efebf2ba1e678ffb461fcd093f810fea5d061ee13fa4dbc1cc5fb58acff52fe0a
c9a3d512cc68e59f167de043fb20d960d573ffce61ed19f556fe10a1f728fd96cd3fe8a9
d69afe6ecafb82d8b21edcaf65fea5f962c3e644f287ff69f602f1b859f9a5fb44afd939
e0a6d092bff51e96ec9fd87fcce45fdd06e5a512edb3fa04ffb8f75a9cff88f2c149ea15
b0e225a9cf0be8c020c4dd02ead031dcafffc41df26de586df9badd651facd84f4c213e1
a822e582d777eb2fffa0bece91ffd96eb5f27abfd989ed85ff73f394fc4cf3b7ff9dcd88
e3a5f815dd3fabf49cd893e07aedcf6bd85aec87fabe5aff36c0eda349f133f9a5ff45ba
d879cb9efc6bafce15bfd992e5a328e088d869ccf47cfe86fb61ff2e86b8ff79da5ffe16
a9ff82fc62c8ff69e086d278eb2fc4dd6ad9319ef893fe85c2ff4ff2b568ffa1f569febe
7afa6cf25ea5e057d801fe4df7dc69ebb95ddd359cfe7cc8ff5dd945fbc186d853fb67f1
3baaed06c4e726a5fa5bd825dcb938b1e078d929ed5cfeb73bb3ed84fbc627dd51ff31ca
b648ffb4f5ac2ed906ed84e0af08ffd892e079d886cef537ff01f133d8ff7aeba527fe4f
d0fd74ee1ee59e19eb4fc905e59ec4f9d142ee01f389e6bf28cba1ed30b6ce32fe5cdf86
b1fd18faa5bfdf7ad837dd5fb7d879fbc64be035d8ab43d8a0e02ecef977fea5ed7fcd86
1afeb009ff92efbf51f237aff3b6e48a05f6afe529b6d99cf986fe944cf3ce39e59ef751
fea1f908d193fa6cd804f287ff4acab67afe8def80affc86f19f088adebf7cff94cf6af3
87ba5ac80cff4ff2149ce386eac187b91ff34dfbcc7bdd85b7c852ff79fab4c696eda9d3
4bea10a5e093cba5d852f299fa43aff779fb9dbff227ffce67edc253f10bff59f494fb03
e4af2ae692bffc72f393ff15afed930bd9b628b8d937f2e5be87ed75d81ffaa5cf97e087
1c96ffa9d03e97ffcb0be052d861d0fb9977ffaf63bfd26de27fc6ff52aade86e756bfd2
9be50ce858d004c0df1dd83ae5b7fe4cfbc85fe51ffc42d2fa97fda3c1e07ac6fe61d8ae
4affdd98c4e070b8f437ff11f7a5bfd94ae42bff55f787ff6cb9fe76fa5aff2efb7adc67
e4d286d81aed5093dbab0fd99739ff92e4a9cc6de67af151fec161fa0db2cb23ec87c1fb
51c9fd83f499fb5aff9fc94fd932fba8e569d901fe4afbc7ec55dd71fed8855cf593ff22
e5af1cc0ee17c6fe03edb523f19c36c1f51dffc495fe25f461ffc393fda5fa78f366ff70
d97eed9f1af79fd892e7a522ec44ed28b6f93cafda22fba0c65cf93c93ff06abe896db60
e12f9cfe82d87addaf33d9c3f23dd722d985e0a5c808ff970eff5ae5a6c3f76ec8fb79e5
afd062c72aedbe18cba3d17fed96c8ed5cffa4d03ddf78d99e4be235d879e0af6b26ff93
e2c448bfff88ed7bd8b26db9f825f1b714e8b0d36dc1ed7afe88e04fda87d8ac69ffce5c
fbafe574d9af34ed79e088d8a849ed32d946e5c498c1ed1fd035dcb976f154ff7bc0dd83
d873fe88d094fb55f27bec0cd981e6be5dedcb48d881f08dfcd00eecaefb0bc0fa931a9f
df86ed61f7bf4decb66df0c0a4f3ba3cfe09e94aa3f356fe1df6a0fe4efa9bff29f7b119
ff41a5e081f266fe9af626ffbfa9ff93ef06d2f9e97df2619fed963ddf2db6f410ff3ccd
9fc75bfa9efe36f947acdd55f2aaff7bfa34f5c44696dd7dd80dfec068faa5cc4dfb12f9
bf9ff76dffb115fb43acf993ff86fbcd39e0af0cf851ffa9e552d917ed6fe097d268fda5
fe1bd3faa378fe6afb25c94daff5943fcda2e079edb7ff50fb99cfb41dfe88f8d040e02c
cc63e084d795ffbb2dd886ebbf78d8b37ce062d96ce0c471bffb2fd91ae5c505c0e965f1
14cb52c3fd955f8ed80ebcff18f8cf8cfecb52e0acee76fe80edaf2887dfc59ffb04b7cc
2f93ec61df79e6b8f81bff58efa03cf2ba13ffbe9bda63e11cc8a5cd79bbd891de63d84d
e10dabfe86c9ed79dac403bff77effa9cb09ff30deb849b2f0922ae0c012ecbca5ff87e0
61c7ff6bf353ff3acf6bd8af0fff7be16dd824b0fe83fb93ff8ff25edd1ccbef72dba843
ff0ceebe3bf4acfd38f09fde7cd187ffaf79fb58aed886dd88eca540c0ddfe56fbcb80d8
ac5bf2679efb9362c0de08d840e2b8f39417eb79d4f782fbc20bd0afff108dc1ec85d18b
e0adcf87dd5bec31aff183ff56f026dbff5df707ffafef6cc6ed5ed92eb7fe399cfb932b
e4bf3ef289bff676ed94dc68bbff7df29fce53e502efaefb1cb0d924d786dc81f029f5c1
4cee9ffc55ef79c2d94dde12c937fe80f97aafff05f9c988d965fecf8b0ec7b659fe04f7
52efc350b9da94f332fe47fa1fffaff620a3edb33bf56bfec20cbee31dd6ff2ea5fa93ff
82d85affc050ffb55cd941dea2fa439bd8fc31aed942fd20f952ff79f693c2fe3ed094de
8afeaf35c79ce6bd2994fea525f699ff7dcbafe04bebd19959fba1e55aafd013ff35f8c9
58d841ff86f99ad17f3bd893ee74fe9ff403feace279dea8cb04c2dd93ff15a7f67bb7ed
9bbfd94de03ac1e59558f19ae5209fdbff72f7ce83d893e4a435f4d520ff73e092d097d8
67e07ace2dc786e094db29eda5ff7eefa55fc5f279d060ef0de573dba5ca2ced99ff74ef
67c1f26fb6ee65ffc57bd885df2eb5d001e27ad86bec06d776e688f346cb73f2d33edfbe
77dc59ea19f685ffa561feafd821c2ff38f1b681e0a509f593deb62dd945f2befe67f845
e5c25ab1e79357bfff35fa71f3a534e55bb8e86ad0fe48fa21a2f5b8fb8861fed22cfb74
bcec46b5d826a9e64aff12d8fe9b63edafcc0ef260e47cf10cb8ffe779ff03ef53d264d8
39dd4bfdb8e64dd920fba2cbaffd25fa63f4af11bfe12bb5fe24e54bcdbe06a0e75cf39c
c1fb6cff9ff321ffb7fb5ef810d6a3fb86fe5ba7f881ffc712fb93de66d81ec7f20fed79
fa6b9dd979fec74dfbcf62ed1ffcaac0ff8728db9bccb78a17fbc631d8f8169cd892e052
feba81fad83dff029fd881d0ed880d9ddec318b1e052cbf984fb7cf294ff68edc188b848
c1ff935be6a5c1fa2fffc3a0dd4f98d85dcfa7fe88f67bfbc298d20594ff86e4c133ec4b
9ae08dd981d6fd5ca7fbcc7cdc94ff86f4adfa37feaf0be544edc652afdc934aabd984b8
ee2cafe014dbc002e84f9eed86d04afea4ef6db7ce93e049d4f705e5429eee79a9ff88d5
7af05a94e7cb5cff08d9f3a7d477ff60c5afed64ff1cd774eac72a9eed86c6f169e5aa5a
ffb3f33dffa5f780ffa936d803e14ccb18d4af33fbd984e107cbf73afe4a9fdb9357fb6e
f51bfbbaf745bfdd17e1af24e877f4c13af7b26bff7df7be56ee1aff4496d8ed8801eb55
d016d83fdb71d889c7f182d8951ac0fe67f2c6f438fec869ffce64ed7aff96ccaffc2ed8
6df1b938b4fb4cff33c1fe88b6cc86f9d81ce8c531dd4fe20bc7fb14a6edb6e5823afa4d
edafdd87fe43c87fed9ef70d96ffce5fe0aa43fe14fbca27e462d879e15ada14c5f395ff
86b6fe9afa79f0b024f29efab686de81bfed09c6e638b6cbeda53790eb9c6affbf5ffa90
ff4de0a8cd16e7b7dc02d1ff7acfa5c0f08632c6ff95f68cfa7afe96f01be448a5ff59fc
aee034d8a10e8ee0a523e09741f9a0d04bed37dd61e4b5ff05d99be580dd87f3a51aef52
ffaf5dbeff8d57fbb0f686ffa562d9f97e31a0ffc0afe0950cf72cd993fbb639dc61d0f1
76b4fb24f4ba8ada7ab6d88ffea7ee2fce98ed9351dd3cc8ed61d841bfdb67febe41d053
ff14d8ff69b9fc79c1fe8260d8ffc20bfbc53d93f2c635bfd986f17afe9f4993fe9f36b4
f564fb09dcfea45ad929e050e9c227afff7bf9cb15d97bea73fb5af6c4ff51d0fd7df1b1
c51efbbb93ff7cf2a2448ceb86fe2cd107e754bfd981dc14c6f42f95deafd1189ed93beb
d0953fc2fed058eb1e86fec19ed067f206d1fa8effa84ee00fc0db79ffc753eb36f24bc6
03b6fa86fe61d0fc79f7af11b7f586ff06acd77dec8bdd7beab427aff22eafed11e0fd26
87e2af6eedade007a5ed9e11fb30d85af3c7ee46d9c3ec20df93c8b63fd2f27dffa5cab4
6aedd252ddbb66ed97f72cccafe08643a7e99353dd09ff87d974e026d4b60afebef8b047
bbf268fec396ff41faaaed77d8acfd03f369fecb6cf2b425ffafed8c0ede93fdce44ef5b
ffa9bfe58654cb21bff98bfe9952e530a5f785ff9dbefb93e549d80cddaf1ebed37bffce
2bec94c5e54bf317fe32f6c26efad27ad8ff65d0ab94caf248fece27fa75ffd750fec568
eb84ddaf26be84fb895afeb951ff7bf7af18cbbe46f70ffebe82fba430feaf3ec7a5ff08
95feb6fa16bef7adcc6ce555f19dfb69f7c961d922e0a5d87ddbac28ed6de0995ec1ff3e
e561d885e0b847fec27af481dd55cbfb7bf163a5d97fe018ed4e96ffaff486ea37d843f2
ca7deed406dfc11ff061d97affa5f56eff9df028e55093dfad5af970ffa5c995d4af4eed
a056e59a46bef93ff3679fd984b6d951cbb686dc7ae1a5c0ff07f890ffce0be1adcb79e5
24d84ee09efb68e881d89a43f20ac1e086d0ff79da6bedcf27d960d2ed8744fbb727feaf
0ebfeb3faeed93ff83f511ff4cf687c8fb0dd1fb25a7d07bf795ff22a0e79305e05ad616
feb466d92ec7f920ffa4cb7cfed814d941dfafff6ad9af1bfbb47ffe9f67dd94d019edbf
34c4e33dd861fea4c0fa6bfec31cbbcf2ce360fb79ff1dc4fb02f7a8e87ad805beff1cf7
5fff96f51efe42f329fb4798d86ee44ea5ed6dff14fa9ff293fe87ed34d8a0ff36f5afce
8bff4df5029ef122fabf64e57ef29b2fffd77befca62d8ff85cb97ff18d658cd73e4c293
d8b759b3ea79afed6af2b52ae053cdfa30bbf799ff8ef0c041f7abffb05eecba3bfab734
b3f57afe9c03c4ef81fe9fcc4ae139cdfa40ff5afba551fe79b3f282dbaf44ed09d73fe0
9ee879fb9ded0dd8be94d987dd74cf21ffb3fad558e0a6ea10d569eba0cdb993d2afed39
fe95d8f92cd199de75d85bd010d96eb6f804bfe27ada60eda9d970ecc962e0b03bffa5fb
3ec0e2a106dd4da5f6934ee52ddc6fe086fa35fe9f3efb19ffd927c4ff3ad8b708fbd680
eebf7aedcf52d833e05197e6c40186e59aca84e079d3ee6dc1e04bd0fb9328dd58e672ff
b7f371b3e588d86dcae792de0ac2fb1af8cc90ff72f288ff57f1b144c6b6f237e561ff4f
b2fe93c8529c7aefb543c189f2abc661fb05f664ff7be0af13bf81bdf241c2f42eff96f6
4cffc884df9554fb1efec02a93feac42fbc186edb60fc788ff6dc9f986ffc615edcf7cf3
a1fa4aefa5da6adfc0afec6297f5719fe083ffcb945afeaf0fff4ba4fe83faa8bfff2993
f3d745ff10f355fb08a2fe2489f0b75fe3bfa5fa12d99524a5e00fc3f62df1af14f862ff
529ee59459dd7fd8b420b7d801dc93ff865afe9fef12c0f22eec6bddfecc2bfe86fbd04b
ff24e580dc9be51dd054f5c7fb49fe88e763afcc80ed67e4af27fe61f2c3a8e0b15bfac5
13e4d39c16fe52da93e7b71fed4fb6ec3493fcaa39feb401c5afc629b6f909f35193cee5
43bef913f24c88edc632df9ac9b1dd1ce3c10af279d2fd50beed87d8a5d892e9be61d8ff
a52ef785ff4ec1ee5cf7bbfe85fb6aa8e084ff9cccb686edba6ac7fe29f63afba2f478fe
63ea16deacd06cc9a8e079d9b6f816af67d997e634a3e07ed859ffc152acfa8ddd9f3e93
d9b21bb8ff03f9bd37ceba78eba4d41bff4088f79bd879f15787f4d87be56cf343fcd986
fe79ceafe071d9c05bed8efd6dff95e17fd48ad8ff04abfecc67dd9fc1fe1da5f260f837
fb5ef3679fda88e560a5dc9b34fb51f929ff4acff79653cceb67d60cdd79b5d288eb51da
40bdff09d44ddc31f3d31fd8ff05b6eda5cf87dd4be0c5a5befb8ef424f93dfb5afea54c
8ce545bcf40ec8affe0af893f1af34fdce6bef2dffb6f16de5a2ed7add6ae0a5fe0afbc1
39eeb57ce6d007ea3bfea5bfff38b6cb2affa4d866afd038e50df354fa22ff86d8b842e6
15f154ff65fb32bf7fef8724fcb933e061ceff86d879db86d893c9fe4cfb1ebaea12fece
93df7cc79fe4861ec1e514bbfd93f29cfb32ff01aed88feecb5ed995ef7dfc5a99fb4ca4
f27cc95dfe0fc3ff9a22ed51cd41c2e485d993d308f1b7ffc4fbd686ff77ee7bddb741ca
87edb717dd84d860e00dff4dfb32c69cfe24f284d99e5aff6bcbfa53abff7db7cc25dc92
de7ffb99c504fabd16f59dbaff8dc8a5e89be41cf4cb81d99ed021edc39cf7d84ee0afd7
77ef96f6b648e502fea5f512ff34b5ed9dc2ff6ff2b676f405b6ed39b1feadfa84f2a43c
e05acf6ce09ec2fb33ff1ba2f977fe27e4a5c5ea77c1d963e032e883f1af3bbff988ff97
f77cb3ff1aed7adc71e027849a30e550d93bd861ffa4f70fc469ff50f5a5fb8fc9a7d393
d9f740afd857e543f6d680e01098f1c746d8f26be567f30aee59e977e079cbff60ed4ad4
30f167ce51befb5aacfe66f986dda54ae51eb6ff92f453ffac07d87bee8ed1bc42c2ed85
e476cf27e048afcb2be060c6ff79fbd05ad93bdc68ffc979fe19f6af43f260e579b8e336
eb93d0be40ff0fb0fe22f796fcafd950e593da76d832d808e04bb9ce9eff43f99fbfe2f5
c77df289fe9ded2ce065d4fb94c0e2b201c138ed57f912ba87c1ef79ff97c9b721edadfe
d92d93fb9e0ffaa2ff4fc5aed132fea5f24496d87dfea4d993ff05fb79cf88e00fd734ed
61febe83fe7ac911a6e93bcbfb56ff23affc63e56eafd85cfb92ff7bf9d865ff86f8a851
dc9a0df38cff98d807b9e795d884edca7ed891cafe5ad8af17fb60f190bfe081ddad49d1
179fff6cf60afe5ef26ffea4fa63f532c6abcd15fe5d06b0ff20d2b302acd88afeaf45ed
2280fe93d9ff83e07ccdff61fb1addaa15fa86fe9344bd86c0e372dfb2c634cea5fb6cff
9ec720d4afea28e1c21af94daedeb6f020ffb8f279ffafca0bf2cf43ed60fbd086de6bbf
e581c5e13bf29eff2cfabf04ea42d0b609edacd91aedca31e8c062cb1be55ceda831fa51
ff25a5ff11fa47a5f17cffc29db7d866ed2df261cbff7ef9c027cfafe086cb95e5af2ec1
e387dd82fc67ed93d8a3e070dc5df6c5ff52f216db9ec5fad83ded61afd028f4ae33d893
e951cbec69d95be5c6f751ff19f454ff81ed89d91fe052f186f85bfe86fbb359ec78c4ed
8639a2dd9349a5e39a3ee8b959afdf93d8af47fe1cf79536bef968b8cf0fcbb554f1a7c7
9cf581fe9646befd5b9fff7bf9a5febc7cfb8af8cb79dd87bee26ded9ac0dc05cf51f33a
f707fe93d09ffb02bcea6bee99fe42a5ed1dff48cff29302fe53eb1fd8b03dfbf043fb9b
ea8635d985bfe571f35d8db6cca0f71dfbb766e097fe5daffe81b6ff37f4b401a5e588d8
a5cb25dd5bfe79f7a9cd11e171d9b601c68effbc9dfe2bbefed46df7b5fe22c8fb6df69f
fb16ff30f098c1db79ecabed18aefe89f07dfed27ae05bee2fdd51c4e87bcdafe164d825
de44edaf25db4ab4f00acdf443d9af2ff386fe96e584d979e1c14fff3dabe49339dd58d9
79c7fb7ad68bdd9f56ffd9a6ca97f679ffc160cfa9c716aefcbf97fa3bb5ff2bbffd0eff
59bfe07ac8ff49f105c4da3af308cb9fd36dffd03bfb62f985f09ad804e1bf6ced98bfff
39f6a7ed3fd00ce05cccf28c46eb08d86bdb86bddd2cd885cf7be088fa60b6ff0ad888ff
d839dd50d924a1f71dd86cfec1a0fa1fff41f30bfb86f193d879febf82ff88c1fe6194fb
66d0ff6de04bd82bedafff45aeda80edc963fecb86ff09f4b724de53fa11eec37fbb4ef2
2cade00de98723f75affd04ce024c3ea83d0a5ec53e486f23a9df008a4ddbfa5f673e4a5
d886fb22edbd7add95ce0ce064ff86edaf33ff4dfa2ea5dd81d869fb78f594faaf13dfc0
a9ff96f351ff04aaff5ef23df9bf05c5e728cc9efb5ab793f479ff87f3c64dff88e5ab13
d970df93d883ddb2cc4dff0fe54ccdf313e442a5ebb71ee5a10ac69ef96affa41dcb99fb
22f8ba14f4b02bf2be9fd84fff87edb1d186fb29d8fa7dd3fe6acb95ffe47cedbb81f493
ffa54cfb06f77dd995d879cfff67d4fa8650ec2dffc062f042afda934afe1ff25dfea0d0
2ec74bfa8cc3df78d1f360fe1ce593ddc03bd86bff82f75ecb41c0e07bcded7dd695e458
abfe9f51fd65ef40c2e625cbbc0dd6b66de5afc73cf886ffbe35f661ff9830eaa5c6b687
f765a4d975fbcf2affc782feaff136afdd80c7fa70ee62e5a052d986e095d055fb87e66e
d8a542ff35aee09a0ae6af3fbef930af6ad9a03be70cd978eecb6ed860ce34fe13fbad2e
e7963fc2ff8dd89b1cfb93bfff6df8c39ee07cd9af3ef7a7fc93bdd91aaffe9307c8a0ce
5af02786fda0ed51d825e591fba52dfa9f49f50efd8ac3dd6fedd087d983b0f779fe81fb
a4f83cff9f06ed95d3b65be89db8ed17bffc7ef46afbd026e0b83eefbb7add9757ef30d8
5bfccb0ff254bddf09d87acdff73fa5bfe0eedaf2fc1f704fec39dbff56bffb965ff93dd
5aedd1fa06ffce6cfe5dd51aaff193ff85f2a7dd6cedc978fcb0ee17db79f2afd74ce90d
e331ed5abfff2cedc179e514f160ff86eb3fd9b2ef45ffbc9ffed8b404b9e4b1fe64d918
ecd16de5c587d9b624ff39f71ba8e530ffca0dd851de32ec66e086cdfc77f428fbce02fe
51caa5e047d507d93da2ff7afed39018ff4cf7d18bdf7aecbf88e894fe3aa5ffaffb32b6
ed20c7afe069d4ffa45be47bf25feb15d847efcc1cf176fda54a95edb67add88b6f987fe
42dd1de2c045c5f8249fdb0cd876e55bfe35e160fea3d190c8a8fb05afd883feb65addae
d745cf9ef77afe69e488f311c549f67bff8731a0f17bffb586fe1ca8ff36eea5d0b89bc0
ff79f3ba62e38ef2abd096c719fa59b4d852e079aff27bd986fe6cf787ff93f2bf57ed01
9bfac39fe5b304ff46fab621ff5dd979cff28848c5e585d4a2f2429df68f1aedcb93d821
de92fe80e56eb2da9ac912e2c139c651fb1ff3ca30e19fc7a5fb529bff935fc0e57dfe54
f9aecfa0ca80f2c42ffa61ff78cd95f74ef30ad2ff9325f6a5fb0dc1df25d8ad33d984ec
a5c0e050d5f8c111cebe3cf25ccaed65d879fb6ded5bdf47d914a0fa3bffc101fe4af2bd
99ed22ffa5c3fe43c0e322eb38ceafde52d81de086cbaee450f237c069f2bd9fca79dd85
d528ed9e18c1ea9613fe4be687ffd830c9faae37fb6aff79cf3ec7a8fb3af752ffbc83fe
86e5a5c1ec9c56ffbe0aed74d0afed03dfafff4ff1b1df873af303e6be1194edafe014dc
44e46dcf91e39f43f2c969e07aed62b0f977ffc299fb57ff2893fba94be59bfa7ade90d9
af40f998e54bdc07fe93f986c8eb7fd8a56ae685d86aff77d3b764f10f93ed9e61fbc195
f1119fed7afda5f92cff6dd881d7fe93d861ed15fe4ff6b8fa68ffaff75affbf66f5b807
c05ffcb64edf8fbfec4ab8f69aff1fd788bfd88ae928d8ff15f64a84dfacd079f75afe2e
d964fa86ed18a9cb3197ffc193ff6ffaadff8651c2f385fbb8ff31ef7ac6eb6bb9fe39cb
95ff52bfed08e542afdd8bd1e919cbff85d85bed29fb02ffa1cb10c1ff8fcd7bd727edb7
4bfb23f0bf43fba5e512dd46fbc98de4be30ffd8af48ff60c0fe35b7c743d888c1ed0ffb
ac20ed3bff93d8afe19b04a8dc4de02cd877e0a5cb79d9ee93ce81f472ff14cca6db07e0
86f1a5fe03f443adf2b3a2d993d6ff11fb38d995e082bdfe89c83db7d5fb5ff5d81ee062
d1b427de49d8f9a139d89c1ba6de60ff25b6fd02d9a1fa21c4e82e95da80f4cd15f14cae
f3953aee0dffa5c79ee177de83feab2ef361f697ff69a9e093d27ffeafca2eb9fa9bec87
34fe4fd0f58c09ee86d3a5e070d0f367ff95f54aafde52e986c7a6ce27f94287eeb6fe7e
cd87fd9ff305fb31ff9e48fe10e529dab8f163fe84fabe52c536b6dd79ccfb7b4dee64fe
33b7c995f260ff27b5eb0fb0f697fe2d88d9af71fb9eef44eac369f5b61fd0ff58f2b6f9
81d892dd81d8af76ed80e1a564fcb85affaa61fe76c9fc5fdac26abad042ea4cc2f735f2
51d9bf9ee118d840cbf709ff51db11e07aed86cb5aadf7d67deaa462e0c497fc1bf72ffa
b104e5ad17d89efe78d096ff5af377e6a3c3ff2dd745f210edc441b8d093dd69e1bfa5d6
affe943b9fd825e2469ffcd881ed5effa40ee5b728cb7de488ed43afe486d2f44fc4dd5a
d86deac1ff0ab9ce58a9f87ffe9fcd79fe6196e07ed853ec0ffb51f23cccff17d84cfed0
7df3d61dc7e587d99f2de379fea4f579fb93ff64afd089e576ed42c0fe86f2ba82dd9eee
88f759ff41f51effc106afdb1cfeb83bff4ebfe181d9c488fe81cbfb5fef26b7f91cafe0
06fdc168e085da93e494d8a56cff87ef45aff319f83efb5286e9b5fd7af86ac3ed8a14ff
97d922e0c28eff98fab559f86bfecc06f9bf67aaff79f216ffb14495e0fa2affbf14d13e
e208edabe7bc06fe30fc9dc5abe597fa67bef486efbe05e347a1ed933df90cffb886f206
e033ddac15d9bd1efeb609ff92fba65ee0a331fd53cf2ec7a5d592d9a1d881dd95ff68f2
75cfed81dda55bf29b51ed61dc3bbce07ac7e665caf17dd9ae49fe0df35afb7aff36f8bd
1ee55fffca7cd885e099c4f201d844debfa5ff2dcbeab549b9f178fb3cd1dd01e9c619db
be7bde9f21fcd83ae09abcce7bf8c44d87d979e593feb892ffbf3588f7c96dddaf64ff4c
cb13a9e42bb1e03895fb86c9ff6ffbbfa6ed6beac451d394ff59ccf36efad86aefc661d8
23e9c203fbd179e887fa62fe21f35ffc66ee27e54accafe213a6f829fbc20effba21f793
fea00cffa441feab33fb4ced97d6bf74cd1bc762de50edd080d99b28fb4cffc125d978ff
adee960ef259d9ab61f893fb2fcf9eec5c86fe6aa5ff9f2ef151ffafc67bfac032f54ee5
20dcaef194f335dc64ed56d673fbd84ea4f483cbf122e885ffd079fb5ac5ffb75ff2a516
e02ad94ed0af21fea5f768afe283b6c927ade045a5f883dc4fffb072beff19d8a4d97be0
9acf0bc59ffe70bcfb3093ffc959d872ebb378e5cb7bd855edcd86f2d275dd93d0bd88fa
31f694ffa6f4b99dfb6daffe10f5c3a1edb577f550e4c05b88ffc579e680f4d009df61b1
ff50bff7d82cd0ee4ccbfb86d870ed46e50da5fe8fd884fb6bff06d45efba1cb26f997e5
1dbfffd312e340b8d85ef3b752ec9dd98c1eecd43dddb982f792ff7bf7bf63d830c1ed08
fb46ff98f480fecc16ec9af26ad9f545afee5dff08edb139ffacf43cc7a8f687edc2469c
f392ff38ccfb43a9ff18f5b568de2bbdff0af557ff13dbb759ec28e050d901c1e52ccbb4
70e560cf0ce292fea81afbd237e0b51efe3e88ff9cc1e586f30ba974f3ba8be079b8e412
f693db86f1d050df01eda5cd52ec7de0c10fffa5c743adef933987f996fb79fea1c832fe
af09ffc1f778affd67fecb52e001e538dc93ff88fa54d199ed7ad851dd3094ffaf3acab6
13c59fe18eca86d653fbbd6cdb7de057eb03d95ffdb1e807d57ce4699ef2d35de0c239fc
97f85aafe5c29dd8b06efea0d0bb82fa8eff79a5ff86fabf3bff94f265d831cceaa26df5
86fbc2a2bfefad43fe1cd866cbffe09c45f80cfe3d9afeb825b4ff6299ed7bffb92fe48c
befe3fafe586f265fed96dfbb6edaa58d9b104e06fde88d3ef823b9edc11beed2c98f3c1
a0b8fe5cf00ee69fb9ff24afda10fba5c0e370d1fa79ffd861f926fe3cf69ce07cc9f127
fb94ff8fd17be01dd862feb8f724dbc00893fb9c63e4af11d889ee8640fc2af2ca3fe007
feaf38e84af1d356dd32eda5d653bffe86ef9562fac906d84ae45bdc27e0c57ced91e4a5
5415fbd87fd887e7c76ad99fe237c8fb1cafcb6afe9ef622c68ffc76d82ed8af02cb47e0
19d0ff29ccf793ff1bf84898e5c6fe5be879ccaddf8846fb62cd9dc7accf29de61caf271
e8b362ff57f32aa5e05297e586d879d86ceb2dfe13a4d864cc17f24cff9ef186dd9844a9
ed84feafe732bffa7dffc29ffb22bfe093dc7abcfb6af179e4c19ec9b60dea94d180fd07
f7af20d15affc03eb1ed96ff87f693ff79f7b04bfa30fec3b26cbfff42f4a527f250fc81
f4b959d8f843edc15ad780e9b61aee52fe79f698ffbd86fe79beed6abf4ab6d87abbfa24
b488f2afff41fa0bffd880ed18f539ff7dfb91f6a83bfe86c6ed0cd886c5fe05b9f61dff
aff20fff94d0adbff44af9a5d981dfc139acff26f5b6ff60d140f25ab6ed22d94de03cd2
a6ff52f362ff1ba5d990d85aff14fb66f761fe1be460dd79ec99f6b711e5a6ff60d031d9
14cd4fd503dcbf9fd078edfaca1faddb6ccdff82eaaf08d888ffb676dcac11faafff4af9
cb85dda5ed39e56bf0af5af39a3dd8fea5e536f1cd66d8fb45ce219fe07bd0af26f8a5dd
75e558e049d815ebc555df2ea0fa93f15f9eedd37bddc03f9bdfb44bfd38e686d06fe333
feaf6afacf77d85bd812e093d97ccbfe86d693f181fe67eb87d802cc93d4f445fe1fec80
d989d8a0cd7bf3c39bc0ff38e04ac7fb7ad820df79eda4fb7ef29bfb6dff10e5b83a63ea
9df08bfe06bedd3ccbffa640dd0dee86ff88d93793df9e5cffb614b8d25bd822ddc10bc4
e89410ee60fba10cffbf79e48fd9f94fb6ed6ce6b84ac1fe85c5a4f287ff79a2f790ffce
4bd921cefb8931fe4e87fbcc61fac781d960ff07fb93edc01cecb70be586ed8efb79f728
ffa505dd52ff0dccafc717f873fe84ed36b6c69ccca9f847f423ff37dcaf46fb2bafd886
fea05ef093f789feaf55c0e039d85ddf94f180ffafbd4bff33d455ed5eacfa9361e5c09c
f95ec72bf2a5c2f10abfe62af396fa86ff9dfa80ffa6fd50f2ba79dc81c6edab50f502fe
5a96c8ff34fbc37aff971dd8fb09afd93dcce504d973b8f580ffae41dcbfa5c2ee9f29ed
a501f794ef9fddb545bb75f9c65bff9bfb31c64bcda5e067c6f06feabea5f433e5a0c0df
5ada9fff7cfa5fee2fb8ca9bde82eb87fea6cb93ed62da03e4cb31d951cb08d2ff25b3fe
92f536cc51d826e0fbcf86da7afac497e123d3f32cfb67d0aafe98d357ff79d9fe7ace61
e044da07ca4ce032d96bde86ffc924fe4d87e093d7b67cdbf4188bdda506e236d8f29361
befe77fa69b6fe5aed1898e066c7f77af25fe409d5ff82c5ea5cd820cb79f697ffc44293
e2af4dccadf19efe1ab9fa429efb9543e25efe7af22db2fa15d651e90dd86cff78fd56bf
f26bd20bef52f915ffacf76eb6ff83fc9cf46ba5ee61c30bb6ec89fe86f47008afec17e4
b11df287fe78b3cc93ed1fd94fe079ea1ecdaf50b2f293c2fe7cf58cf1a1cf93f91ed048
aee492cef71cff3eeec337afd7f152cffa88f3be4eb6f6d52fe09ced35caa5c0fbd33aef
0ba5e01aff94fab678e051aafb8fff55ec2ed80eefadfe16d5f46dfe01dd6ce584cfafda
13c9ff7cd99bce4fff72beed81de8ab5fb97c2dd03e3a51dfb52e293d883dfc24499ed1a
bfe724dc46e9c986d8f9a5ff63d914dfa4c798f567fec17effb741bded0eff4bc2fe8ef4
02fbbe9dfd3af8d708fb35a6d863d925fb58ed7ab6f69dfb64ed33b6d89bcb6dfba2ff4a
93fe9f5fe06a9affdd3e93f0c21aaff861ff2886b2ff79d8fe69b6d058c847f31dfec92a
e277db93feb6e568d87ded9f28debf95c3ff57f32eff60f2ad2aedbf1aedaac3e53fa5fb
2ff6ce3de025b0f779ffcb8ad979ff3bf4b467fcd379fb61add87bf9b517ff3c7be52ad1
95fabf45ffd933d8ac45e861d99fe05bd881e0a45be77cb5cb42ed6ee4bd69e69abfee1a
ffacea76d613ffc63cd807ddafff86fa5af3b00de07bebc611edc025fdc51286b9fe5e87
ffd084db93d7ed49c2e79b44c2ed2dfc83e090d9af68d8b0fa13d27b46a5fe30fa4fb9ff
9349f838aad988e491e07ad1f9a552fe64f9058cfed06bc5af7aff86f264bfd844affa2d
eda2cfbe22eca52fe1c596f259ffc082e296f2bf9efb79ed5aa7e47a5bfe76f19ec5fb03
f787fea5f619faba34d8ff68f893d81390ffc456ff83e4be48c5fe89e2aa70f286fea453
d415c0e02ddac05cf929b3e062ffaf4cdcacfbd803cce6a545f110e554befa9326f9a9ff
75d8acf00fff61f59aff5aa1f287fbb8f283db89cbe565d1ed86e0bf0ffb4cc824fe4689
ddc386e080d8f2991de2ff09d94fe6a5ff39ed95e565b5c707fe6dfa7acdffaf41fe0bd8
af33ef65d456dd0ec2e032c9fd23f2ce86e00dfb3b93dbb732c74ab6d877cff29e16e0a7
29ffadf03ea5dd24d8539af79330d85afbcb4fda27caf289ea61a5ff84fe95cca5ff86d8
80cff879ee5994ec9f2bfad97afb8dfe9f01c5dc85e015b2f63d96ddafd032ed0bc0d94a
e435e005d05deca308fba71eff79f693cca7edb9a1c1ff0af6b636ffa849ddc05a87b8f1
9cc818d6b987fe12c1ff79f156e5aed90986f293c1ed78e593c4fe2bf68efeaf52ffb683
d89c1af6c094d6afee70ffa5f186ed2eff9446feb87beebf7ade63cefa7cf58efcc60abf
e594ed01a5ff8af8b437ff79fbbf4eed1fe969d954f536ee0bbce42fcbf943ffc166b9d8
4fcb37f1aeff56f36bbee15cccfe8843f286cba7f76cffb3c794ff87f725ffc152eac55e
d92ded53ff04f861e57ad86aead060c7f779feadf8d232fe6afb79f826cfa5f334d88cdd
9a38ffbbe929da529fff4ff202b1e07ad86bec93d901ef51ff
    >
  >>

  /Yellow <<
    /HalftoneType 3
    /Width 167
    /Height 167
    /Thresholds <
1ace5bd99808fbbd63fab215e074d886dd9828eea2ff863995fa6ae423cff0a306f59afb
45affe9cfa05f394fd60ed1b98e72da3fe8ee926c9e51adcad0ec5ec21bfd810bbfca5f2
7dfea0fb88dd9ed00fd833e5c8fe65f72b93e1aa3bfb58e564ed19e05dd1ff62f4c7ff1e
f2c5ff15f19801fa47f12daafa20ff4df318acdf83d29eff67fb1dafd979bfff4ff7c73b
de4cff29f57aff6dfba2bff384d188ee6dff5ef20bf9d8f686fe33f5afcf4beaca6cfb9c
f32cfe01facb64d915e5c6ed06d97cf7a943e0b0c730d6bc67cc7ad5be67ca26d8a5fbd8
79c7ed56d87dff4fbefe69d6fe79affb69ffa0de4ad938d852c807e862fe79f4affe8043
a5d986dcbe23ff9dc8b72cfeacca82fba327de9332a7d9933da5dc5bffcc8ade7bfecb6d
eac0a5d894fe61b7ed5aaadc91c8ff56f023a0e0039df48dd885db59d9afe042ed17aaff
47fcacc721cca5e469afc0e076d867ec86ff9d1fbfd845bad06ae9b57dfe93f6a551b6ff
a0ed5ac7fb70ff7de586f4d92bef58ff9ff287ff37ba5dff86b3fb0ef293d987b0eb51bf
f145d0b234e686ee79ff85f691f0a5cb19e2bf5b96e9b6ef13ff4dfacc7adf0bffd98840
edb50ae8c178fbb6f76ffeb5f87fd8aa39ee62d8b03fd9b461fb28e63fcef62ec3ef0ef7
4a9ee586fbcd81fed158e909f98bfec11c99ff88cae666ddbf2ff6a5fe79c1ff40940df1
acfe17da33f0adff7ff88beea5c659e433d64ac1fb7ace3bbbff169bdc20f250ff0e97fe
b5e01cd948e2c290f7cf03e03bcbbc61e232ed09b9fa2baae081edc15afa0dcdb4e01fd9
5eff83f7ab3cedc21eff87d0a5e46fb0f651ef6598cffa61ffd07bfeb004e151d80cd253
e025fbc0a0fe15f799ff06ef96c790fab272aefe7cd886ebd012ddb75eed32b1ffafc665
d03693f8d252da339bf1129eec60d83ede1dbaedd6fb9e45c1e47ad48bdb42d80ce04cff
19f888b7ff84ec1fdd6ce781d0aeea5dd289d977c8e68643a6f784feaf0beb45a7ef94f5
80ff9fc4fb75ff5dcda1ff5bf704fea7c796fe30acfb9cd028dc55ceff7cfaa6c84bfb30
baf11ad893c6aff714bfdd934eed36d9c495f183e587ff93f27be65dafe486ed79b7d646
ff52d809ffd822e243ffbb76fea535fac494e48626fba5f1afe34aacf285fec078fbd87a
ff89f295fa8f51af3bc5e87eb1fa55fe6cf487fe79cb9fdb6bedc911df9cf388fe0cf44c
fc86f6b3fe3beeaf34fbc1ea5fb6ce6efb9cbffe53db6bd818ed48a8d892dd84e61ed988
d379dd3be560f3c66ded7bfd95f2a20ad847df6dd993e05ec2fb79ff32ea5ae0a42af5c2
adf867ff43bffe62ed1cc94ad909f4c84cd832c7fe6ae2a1f280edbe5cf99ccdaf29ed50
c1e0931bf247d7ed54db14ff7cfbc60ce05bf4b23abde509cb5ae064c3ffee93fb61ff1d
c4ed06cda5e73db8fb2ebefe4395fbac56cab65dd993e0bf35c5029dd87bfea3d08910ff
d927edc56add88d229feacf896bfe51fef35f478cd95fb40f49aff81d9a34dff02df51d8
34c6fb88f391fe05f57afe9741e5a0d486fc80ffba61de209fe588eea428dcc0a9f6bc9e
ffb77aff93faaf27f3be12b9d03388e9c166f179fdc68ff778ffc0a4fcb67aff98cb5ede
309eff93d81fceff9350f79eff17b6e52470db03d9b7f2975ebeff27c79ae486f17bccaf
f238d0ff30f9d578ff2497d9ffaced61dd0ae04bf2d59651faad3dff17f664edc25bcf3d
ff69fabf9cc2ff50ed6cdfc21baff012bfeb93cb86f993ffb668e02ecb61edadce10e8af
c806edb71eda4bd2fb84ffc94bd812cffa964ffc2de559c635e01ad060e89fcb86fe79fb
a5ffaf3bfb05d9ab44e508d95fe76acb0be1c13aec95bff3d861ed7ee6a369edd17fdd6c
cefe86d3ffb7f79f4187e1acdd82f26afe12d851de06e460d979bee1871aeea5c3fa8552
d82cffb7f87effab69f5cb75e093bfe17bd8a50cf28cdf88d9a551fe13b4d808ffb57afb
d868b6fc35db49e5af12d944eec0a9ff9fc551ffb768fe72f863ffcd79f29a08e4b679f2
86feb860f3cc91d887fe91f29cfb83dc0bff50e53cdc54e018d995c5e369f396b8ff9fd5
28fe92f66da7f876fe0586b6cc2bfe5af7bc04b8fb2cf2a738ed50a53287e0bdfe23fa3c
ea50d9b8f670ff9ff986ff95f70a9ffeafcb4cea3bbff28ae0a44193d824c6eb1eb6ff07
f25faffb39ffbe67fe2ded01cff27ce161e9a5c82aec9347ffca7cf59eff79f5bf9dfe87
1bf24ddb2be086edd136dab5e046a9fa38e6afcb3efb19e2aa41e7bd03ff4def0edd66d8
52edb6f67ed988f2c293bff76efe79b4ff1dec63c956edaf51db40edd220dfa1c4ff46f7
a5c1dd32d8fe9c58d987c7f97bd8f1c7fe5bed78d393cbaffc9f2593edaf21bfd227e05a
edc742f16efb83b5e516fe65f7caf159e561a0fe86d7a5c6fa24c2dd7ee39ecbb67bfe97
37c8a8fc86f759fe61bbe4a528e55ad01cd83be05ecdb0d993e683fb79f8169ffa93249f
f0c67cd886fe6aed88d875ceff9d6de086d97ad0a5f926feab3aa3d324fea90cff479fe6
23f242c587cefe25f879fbd082ffba5cfeaf53ed8edd6be41097fb8d47c5f579ff0cb2e2
12864aa5d80eb3f361ff0881e2b4db46c6fc67f4b582fe74a5dd93d806d0ff71dbafd40f
87afff80fbcd42dc50ed3590e8984bef1dfb52f4d84ae0afff22d039bfdd8dd2f30ccff2
8ad983efa5fe85fa26f652fe0ad0aacb59bfdd4cebcbfe8811ff56ed15dba5ff55f7962d
c3fb3bf2b4fe3deb75c988deb9ec58e06ccbee7fecc461b8d293fabe469eddb5e206bef2
169ae182c7fa39d81bfb80ffbe60e0adec23d0a1e769c2feedb6f681ffcc2ce5a6d8f437
ff86e57bd8aa4febbd2ed0fb1dff60f7a52bf39e45fbc4ed34c1dc05b9f37afe9ebfff77
d2fda5d693e010b2fb87f35de593eda218fa409fff9352fe07faaf4bc1ec6adb7be080b6
ea26ff99f46cffbe8043c0f29bd093fdb32dc0dd0bedafec7ed8a5169fe093ff5af402ff
79fc94f936afdd28faa5ff58dd17e0aeed864f93ff9e60cdfb35f40ca6da84edafc942d9
f218ff62b0fd51befb42972ed819e04b93fbc04088b9c862f10dfa3affc40ffed9af52e2
85ce7decbf5dc5ed9469b7fd529bf69329e1c511d94df405b85fff62acff6dc71cb6d982
f86affcb79f1c76fe0c1a4e96cd8ff9604d0a5ff16c9fb65f08be01ed8a702fbaedd65e0
27d94cc7f29363fe69d41dff51f5b9fa5bcd19d984d59acb1cd87dc7fe79d886d901f195
fe7ef60ffec5d93ec2e984b7dd6dcfff74fe9d5af5ae6db4cd93c0e47ded27ceadddff77
faa4c2ed679cddff59fb99d0a5c0e079ddb08964ed9bc0f234d953fd8dfa22c0ff17ceac
e564d2fba568fb86e0c194e6c52ec0ee3cb9ec96e445d710dc44b0e0ad34fb1dee45cbb5
2c86f2affc39c0ed9533d6ba40c3fe86f2c58ded1fff84fb79f69e5ffaafcb93e5b786df
6dd82eed76fbb8f239fa61f04de5a407f249ff6ae586d036d96dd8992efaa5f528fe4ea5
f1944be329d0e902d6fe37f84ef20ad995ff88f56794cfba5bfe1fd0f90db6d81ced50fe
329af25af6c8fa03ff45a7fe95e40eb6d880e250dd6bfa1dffaf47c0eb30f1a83aff4df2
a5de76cdf855ff8afb77fec297fe03ed86d4b899ff67fddcc359e477dd9f4af4aeff7ef7
a163dc51e238bad352caafe004e5cf1dea44fb37f8cd07fe94fd86dda54696d881e0a5fe
68edc094d5accc3dfe5ef4afff4aeebb69e07bd892caff23d9aec0f763bcff81b8e579dc
9ffe6fd75dd905e046f234e78ed9aa5eee76f8af7bdf8ff5bc16d8973d86df93c5dd13d8
86ffcc3dfeb2f584ef8dd07bed98ff84d87acdf786d979fa08fe9f25dda905c1eba55ae7
6dd894ff57f629bed81392edb624f988ffcb79e256db0fe4bf2ef99aff77f4a5f931a4ff
7bb6ff89d8a4c55eaee9be3db3d00fffb4f31fffc010cdb62cff51f81beea0c0e99d22bf
e579fed012ff5aed06bee661fb139fdd9050ef279affc542bfeb1ff086fbc1fe9ed87cf4
4ffec786dc43cbff01d84eceff6dfeb7edaf5ff86cfb79f259a0ed9301a5d82ddd54e039
d807dd5afe16b2e420d093d880c7f171d0f6862fd0f220b6f947afdd87ea7cfaacf43fff
c75ad81fb6fe07c7a5fb5cfea5cb6ad8b510e461dcc14bed36d952f50dff96f277daa7ed
67e179d763dfaf52fb7af5d06ee09bc887fa0d84d5fb64cbb134adf286d39ffa7cb4f293
c4fe3dface93dfc10caafb7eb2fa4ccbaf6cb816ffb502e0982bffaced6ab9ed84e57bb1
ea2dd518ffc024edadcf3abff761d9c1fb60ff9ff5affe6ef8aff39fe76bc1fb60ff40ed
5bb7fe3eafd8ff61bffecb79e4c107fb51cf36e072d89e79f386ed64d896ec73b9d088ee
06fd46f7c693ff82fb95bdf999c7aee050dc26ff4cf722ffbaf631fec26ded9ed842adfb
c134ff56d8bcff3faaf103fbdd67c1eb24dc51e039cc54e57aedb61eff6efa87f22ae061
d0a2ff28e57be068cbfb79d3f28811c1fe2fa5fb20f844c188fba94fe59fc92eff9de01d
afff388fe0b63ec71395e49026c749b7ff33a2ef82e2affa14d897e553a0ee913d9cf32f
fe9ec9abff90bffe0bf8d011e0affb2bf84bf320ff44afe08bd9a052ee29d40de45ace16
fe6bbffa81d69fcb8bd8a14993eda306f9af24ff88f115a7dc8ae1af48db92e088d87ab7
ff43affc93ff8af59bff2cafcb74e05ad735e9ca93c1fe14e25ff3c5eea7f842beea57a5
d9fa5a9ee4cd6bdcc495ffd95fcbf17ddb78e767f07afbd083edc90df193fbbfd84effbe
ee93dc7deccb0dd8b8289ee885ff29fbbe13e0b3dc65d87de05ed917f24a96e253a6ff94
46bed0a0de87d881ebc878f22bffd084d96cf0afff7cee93e52ca5ec61f119fb5ff0b6dd
7ecbe879d3e55bb9d982ea4cf21ffb7ec4f62afe4df41ecba5df5cce32d80fd968d6f405
fdacf686dda551fc3fa0f280d8ab52bf2993ed9d1effc237afd7f68c52ffae4de00aaff5
31b1fe0cfc96d408c8b728e057a7ff6dd94981f9a5ce8446fe02f74bafe55af387feb05c
cbb667cefa78ff09f7a5fb24f186e5a5c6fb6dc1dd60c9f685ff6bc0fe3cfa9912ff5ec6
b71afb93fec241a5de33d863ffc901fe87d97de00afe39fa28b7ff4093fac83bfeb1f876
cfa4ed0ab3d36be288d97efb06f786f2a6fe80f9bb5de0963ac3ee12ffbf79e5c649bafe
0bfb7affd86efdcd79f193ff8022beec06f187fab971d897df54d8b03ffaa4ff66f47cf9
d34de5b2febd2ced0bfbd99fd1be9afd73ff94df36d3f50bd9f1914dd593e6ba40ccb66a
ffc051ed22aff130feab16e53aed03b0cc6fe5aed39fe97ae05bdd2f86f7d579fc88f2ac
59df96cf52fe98c7a5d973e267c7aaed03a1e4930ec99eff52beff68f9bda1ff3bef60d9
6de0bf45c5ec1da3fe79c7ff649dd87bedaf01ff97ed68b3d3dead13e43aafd90adf4ae9
c6fe7dd494d92acefb1eff87f976eec286dd49e0aecd1293fba21b88f2d16de189c336ff
56e025dbc017c5f96d93e09c3bffbcf237ca79ff88f5d8379afe7eb8ff7bd885eccc79db
aefd68f4b632fb4cf538fea8f39fbfe1a81ff255cd11c1fa78f330e6af3af960beff9af3
15fb61cfff6dd8fd5ee02ee786d0af40ed17c3e097d283ff1c9fff9357c2f040b7eb1abf
f72efb44d9f586d825c1e93163f090bdf850febf9ef9b68f3fe05ef379ff589ee0c13aae
e517ff50bff19733ffbad932edb8e74199ffad5aecb47aee8dfaa550eb9f47c1ff52f9aa
d91c9ffe87ed5add0aa5fad00fe0d746e701fa4e9eff935ac4df1aedce81dd91d8bb08cb
4efa03ffc190bcff99eb3ed8b8ff6ccced79e00eca47afdf87dcaf4bed31b6f193d862fa
1ee4c493fb8650fe21e8a8c2f675e5afdd6dd3fa69afda79e0a5ce91bf4dfe9df775fece
3eff69d7b27ae65ccb1afcafc1fb35e5bfa9ef6293f3cf5bdb8deca505fed86187f7c67a
ff63c2de14cbfe20f5cf1ad963caff79fbaced22d886ed6ec5e562d116fb6bbfe24b93f7
a26cf988cda5bff21ebced2d9fff935bfeb525f970ff93e67cd965ed4ce02ada85fe9122
a5dd15bbff93f485fcd05bff2cf59bbffb86c505fec09aed74fe55aff2bf9ff3b84aed3a
d704fb2fff9a0dc2f248febe5cff20f180c2e03cdaaffaa5c4e608f2ce2aff85ee76e50f
a1dc9314f844d1ff03a0fe79d82df6c45d93fbc1409cdd03aff475fa79b9df64a5ff81f4
2cb5d404dd7ae561fe06b5fb33b0eb9ac7a9ff80eec15dedc428b9ff34e262d0fb79f8d0
47bfe40bed98c2eb51d837ffa2ca94fbaaf1b548bee5b3fb82f89d4bd82ed9a51fec94d7
71e819cb48ffb557f22aacd811cde607d934ca86fb93d985ed96ce7aedacfe80e5a608ec
6de5affb1688ff94057cdd569afb9361f3b6dd52d886ffcb64fed17feab46fe6ca35f29b
ff73daafe91aefaffe6af9cc2ed89fe55193fbc044d6afed5cf7b755feafd094c4f258c0
ff2af94cf034d31cffb13cfe9ce57ad887fe9742e5b570d8fb7ac961ff3da5dd88edaf1f
e83ed8087ffea2f20bd852ed62c0ee89fe7bf1bf7af854fec38ee0b079edd96dbbff7df0
a370fa82ff6add13e55bffaf60f3b637dd51d82bccfb88d9c444a5d4f24cc8edf524ffbf
35c2e09614a5fe2ef2a526edb83efec327fabe80e1af1cc0e43afe51dd79d824e0bd80ff
5bf224ffc809f096fd1199d982ccf2881cfb4ce77aace072d886d879e09ddc7bcce561d9
17fb4ced0edbacc906ff9d24b8f393d1affe10f778c8f96ffeb6f6d037dd6dff86de26d2
fa04c644e559ffcb09d9af36ff63f7ce3599fbcb44e05effbd4ce0b0ef53fe7acc27c0e2
15ffca87fa91ff984ced2684ffdb66ace49f5d8ed883eea6fe44fab8ed79d865c7f95692
e29f69dead11f260d7fb62a5f381cbaaff57f2a537ed96d093d87bb6dc86d85cbfff41fb
2faae0c099f326bfff11f4affe02f687fe55f206a5ff83f2c39ec0f66afe7ef154ecaed9
46fb1af079cf5dda32bedfa24a89b1ed86d55ae89dffaf77b6ff9ecfb93aa1e486ea9abe
e510acfed51787f8b5dc37d2f59326d0a4c7acfa89fe52d89e4eef1ed861e0bfa1f8d896
0dfbcd1fffd0fc53e41ad87cda86d239f6affe4397d6ff08cdf549ff94c4fe4c93f0d808
b6ec1597e584fece67f610fe4ef73ffe32eda7e174dec293ff4fee77cea5d952ddc4449d
edaf2fbfd988fbbf39d5b65fe83cb1e02cd892dd83f568e6a4e068d893fe86fb970cf2b9
ff26c2fe19f7af3bc74eedd861f016fbaef475fe23fb43d694ed5c84f3d89f0a93fc9d19
c1fe76f80eee41d1aaf26cf8ba77e5aff512ff52c238f4c15793ecba33c69abeff63f507
ff5be59802d9ade573bfed79b6d886ed2fa3e9bf4286cbff69fac943d90abae44cd987e0
afd2a4c688fb2befa20bec7bda17ff39fa89fe7994e9c04fc5fb951fea4edd97f826fb93
ff79c6fa5bff3bce0affbc2dc1ff42eb19e54cc3ff6adc7ce29e58e07acef283fe9531e0
7ad886db27d061d9a6f185ff46c7e7a741ffc6eb79e2afdd4be395d866bbe80999de2dcf
fc9442c9a5d48dfdb079e0abfe8661f00af748acd98cca9dd86bffcb6def1dfb35abfe1f
f951affad10dffaffb9f37d986b7f69efb78afff6eed9e18f25aff01ccb567fad061fa87
c6afe55bed0abbf827ff8fdf6de2c1a5ff79ed66b0cc08d8bb179ee5c195fba5ca79fc86
b6f49fcdb9a5ec88d516fb45f5d092ff1fa5dd0fcbfbabff40f35dff80efb751c802b6df
9720fbc060b726f35aff80fab138ffa2f66dffc986fea502c1ff76fb64eb04d0ff3ef218
b8e0a5bf93c5ea25f14cfa22f0bd47fb93bfd888e761d0a1c2e06190e36dda22d3f45bfe
21d65ac1eb27c8b634fbcb7dd995eb7cfec143afdf34d8fe639ed885c9e56ad960f114ff
4bf835cdb911c3ff7df155fdaef4871ced4edc35e454ef02c85cff69f329d956ed98cbb5
07ed5bc5fb71f5b7891cc2e69ac9afe013fe93faa3f472fed079ed94fbcb88d831cf01ed
c65bd823e0b53be55df2afed86dc1de09eef68b8dd7dcbfb46ffe530fe76fba1e080ddaf
86e0b639ff4ef7bc96ff39f314ffc831f893ed6db4e593ed80ff39a4fe84f8d868beff29
f655dc24f29bff79f5ac03bff725ffa33ffba5d098c7aad293ed65fea4e041d997d46fdc
44d9bfabff93f285d89cdd80e136db93fc7bffad5ff878fdbfa0ea42b2d052daf960ba08
f74593eb7bdc29e257cc30a5dd07d93ea7fe68f086da9f79f988fec17efa93d827d93ad0
58f2c43fbefa2baeea609eda7994d889d658cf32ffc15afe19ed87d3a4c906e058d885dc
78a8edc34abdff01c644ade06beed461df04a0e846a5e08cd094e56fd810e6c469edd251
dc73d5efb61efe54f47afb0bafde2ef28af669fe29f793fe6bf95ed013affe23f84bfeaf
faab06c1e033cde721d89335fe86bfff25e582c6a5ffd86dd3fbc349affdc392ffaff368
ff82f6d012e0b6fb57ffcc16ebab48d919ed63ff7df794fea96dff86cf95fe12f2c422fa
ed5ae213ed93d9a60bf379d0aaf912f46dfe7ef29cfb44cdfb5a9efe7ad0a5f7bdfe10cb
b51bf295bfff81f7ca50fa16ff4bb6fc8db846ffb56dfeb9f3128ce083afdd24e45dcaff
6fd879d119e086e8bf05c3e225de79fac66dea94d1bf1d86edc661affa79bdff63f3c4d8
01e45df16cfe2eed5194fda51d84ffd8864ced11d847e1b6c74d93e8a53696e02ba5dd86
cdf475ffbfa2c1e04fd816e5ba20e347de6fd585ffb26a01fbaaff7af96bfdc49abeff58
96e383dd30d8b61bb8e49505bfe01fdd3be55186d998fa7cffc354e236d80fb4e97ad886
cdee31c1f896ce23e2a13894ccff47facb6bff99d8b642ec9efb52ffaecb3ea0ed78a8ff
89eda351dbae39ff61f5d455ff96ed13dd4d9de0af4ba9fa87d89dd990d787f5c02eecb7
dd9d0cf6bfaef86dfd9e1bf1affb6effb9f46abef251ff309fe19343f906a7fb8ef083cb
f578feb6f74ee03bd9c0a5cb70c6b61ede50e83ded29d9fb40cbaffc53f9a6ff6df7afff
7cf295fb88ffc02df153e640a8fb7af59afe6ac2fe3ff4be65aeec1bdd5cf17ff9b1fc68
b5de8b05edbe3dfd86f7bf03c3e9995df2afff4df3c959d829cbff0af1be7ce38ab9e524
d988fe84f2c10dfb86de62ec3bff0bfa49e00fd9af61fe3af3cc69e03899de7dcbff5edd
27d84dd90dd0fe88e57cbdfb0cc4db81eccb31d869ff52a5d997088aeb9bfc77e6ff4ff2
3cf6d086f294d86accb179b8f1649dec81de31cf4ed82cd95dce62d819e393c7abd088e0
1edaaf43beed2796dbad06ffd985ff7dfb9cc608e04ce52dc4f2a8d87be5a728d980ff87
39d9fb11e07fd89d0ef896fdb67ae168fbcd10ff419ff9b73eb4d839ff81c6ee2bfeb0ce
93c7a9ee67ff79f7c593e55ca5fa88ffd22bef3da8d87aed88f77ffbaf3cd905caed6bb0
f758feb968ffb6e407bffd32f2b9ffad1cbfef2f8ada86d89d48ffba10febff704fed822
ffc50fd860ef91f383edaffe0cf9a5f472fb46ff07f7b1fe60cef282d2aff071faa0c542
d158d8af36ffd178f39ffe8539fb4eff0fcdf1b948b3edcf6db5c864fa31fcdfbf62dc3c
f699c730a4d981edcb6de0a7ec6de5a4d946afd89415fc60e679bdcb9ede4bed01adffc0
21ed5bbbfb96bff904feb0c61fecb876ee65feb241ffd42adf9f22f394469ef9ce5dd862
d93fd0f95a9fd8f827fe07fbaec979eea54a93e0a15ee84cabfb92ff7ae30afec13ea0e0
85cb54df9ed87dea9b5bc0ed8b0afb52ff1bd837e77bfd8bef0de5c15293d9b716beddae
cf93bbf3588efea2fa20a5ff2af4bd93d0b68644f1c1a5d01dffaff34cfabd16fe4ffb03
f9bf26fa96ff6ff4bfa0f223f939fe1db7ff90c1da44e084cfaf08d964e683e4a344ff9c
cd37ffc39cd77be3985beb79cfe679ddafed2a89eda0fb7bed83c6affe65b4caa4dd64e4
24dc60e5b6ff6fc8f385cbe551dd25c69fd2b679f7d064f025ffb20ff2b73bd8fa2aa9ff
c1a4dd7be489fe5cd820e0a0fe74f5aafa29ff7df652fe1bed62d8afe514dd64cbe588d8
56e616ff60d9fe8f05ff5bed6fd87be0a55add9acf8ed8a558f168d21be052dd42c2df93
d989e46dcf33fb63f29efe46fbc386fe23d75ec8f26ce57ddfad14fa50f21bccf6abfe4a
befa17fe85c2ffb318b7de0cff4ae50fdf37f253afed92fe81fb36d81bde32b7ff1397f2
81b6eb43ff5ae5a72eff9add81c6fa6bccfe79c593d94de030bbf948c7aff385f9ad3cc0
d91dde6ced9de093eb73d6a4ff30fb72d388ed9f51f67afea5d795ed23a1ceea7fd987e0
3dfe07c0ff75f525f261fec590bbea9fc1f787ffa54cff7ff344fba0e97cd8b511b8e36f
f2b452f49fff26b7d00bfc57ed86d8ba93fbb7860fc5f29161b7d05ae03ad986ff51cf94
d886f198ff89d4ff33ce4dc6a1f17af888fe52d0a9fa3cd8fd6bf293dd14fcc786d85bed
34a2e525a5f113fe70f586fe66cba5f10b9cdf52cff268afff86d85ccd43d809b6fa41cb
96c3f24bff30fcc20adeb636f24acaaff438b6f72afe9fefc394ec33df86d67ce033ed09
ff40fb7a32d804e4b3cb14c5acd50fbff929ff94f688d917e9c68ed872ec51fea4bdca93
ff48ed31d153ffd99733c2ffd93ff79dfb60f3afe465f223fe56c379ea1586b6f787ed0c
cdbb48d3afec79e467ccaf02b9c925aef1934bed04fe89ceff67dcbf57e4acec02d0afed
15ff82e5c12eff87bafa34c4e704fe88fb79ffc786e07dee019ce0b8d96ce0af5dfb86c3
ff68fb75e557c6abcc15b849fb64c9b0fb4dffaace93b8d888cfaffe9bf17efb78f192fe
69ef5aa5df71d835d456ffa540ee0efa88db79e740f81fd3a7c0fe81eea546fbadea0293
edaf0cc6e89329c0fe79e7bea2d9fb61c0fad81ce0abff66fa98ef099dfb2bbeff76d9fe
69f6d760bdfaafe179d9a54ff392ff87d342c99eff3e97d959d844fbb579dd13a5ed9556
f2b7e320eda84bf421fe61bfff861da5f73dfec598ea02afd81bdd88ff7cfa67d8ff92d7
a6f71993edbf0ef74bfb5bf319e864cc58d72edc51d928e086ffca49edaffe7cf385cdfc
7ede9acf30f294d8afed60fa0997da20cbe56dd87ef8c96ad8ff8648c4eda038ddab42f6
04bfa5e05a9bff9350bfd824e582ffd95ab1f417eda139e0a545ffd98c33bff71ffbc50a
de38f49cfb62f179c7f77bfc95ed6cd0f65bffcc79febf873ba5d980cbe56cd9c2a6da5a
ebb2ed7ad086e227bef979edc098f20cd843e3a653f222e95fdac43b9fda80e096caa8d8
92f610ff86f49fff7af7a5d11d96f7c1049fe026dc60b6c838ff5afabf02ff4fa0e079c4
f271fe65b3ff29dd59b6fc3596dfabf505fbd07effcc6de04eff2df3cb3ed7f579fbb4c6
3bc18cc5e086d880facb7afbcf861ac3ff6ca9e06caeee7fb6d816c1e022daa52ceaae1a
c6ff0193ecbe4de025d2ffb3f860fe2cbbff953cf72efb93d846ff13f353ff6dd9a72dfe
4ab0e095ee84fec09ccf7bff86feadf569fec221ff3bfa50afdd94eb61cd07bac743feaf
e05c86ffd06aed88ff1bf6af7be0a862e07fc9fb27afff3be3b7f607c1f093ff23d1a7f1
1cfe7bd98856f21798f993ed84dab06deeb602e44588fe9ef71eff38ef4ce12195ed0d9e
ebafdf4dedcd52ffd159fbcb7bfe86b0fa6bffcc73e0c0529fe2c2319bfb88f49b4aed15
d596f29110f0d080e0c008f2b784d88cddadcf3bfbbf6bd3f978ff31d910ec38fbb704e0
51d829e040a4ed7de49dc0fe78d823b6fb99ed80e86df230fbdaa542f8afcb50e46dd3f0
14d0fe9bf6198eedce7bd8a04d93e89f45d962e588fa60d8b94ab1ffc1a5c5dd31d01ffe
c00dfbc37cfe8fcef25bdc78ecb795befea5c4ff62c1f73ffe78fa9811f19e32e9992ae5
52ed3bbfed08affb34feaff37afeafda12d861e5ca84dd73ea4dc3e0a55bff9f67fe56cc
f969fe9a0eedb95aeedbaa24c75dcd8af77add67e5c96eedb5ff79bbf96bd9b413ef31e5
5afec637e053fe0bcdb88bbf18c2e1930bfbbb98fe4bbcfb9229d953d5ffbe47e512edbb
d96dfbcd83f3c03bafe27ded9de521ee4cfb72ffa8e9955ce0a237db5ad921afe811afd4
5ffb05d064e852b0df7ad993d12ebfe186c7fe77c5ff6cdab6ff64cf95e05ad867dc21d8
3ef163f9a8ff0cb6fb3fffbca2f96dfcc10dedadc4e4971fe941c0f67dffaf860bff87f3
a5fbba46cbafff4aa5fa931199f1d305e749ff86d0af84f2a569f993d0bea2e54dffd881
fb5fffcf62e02dc3e79442c3e56feeb56186f8a4fc86ff32f21da5fe0a9fffc510fe31f9
63b6d893b8e545bf69ccf97bffaff496f99fff79befd3df286e37dfc2ebff925feb207f3
a5ff71f820a5e004a4f3930fa5e527fe86f6a1f293ff6bd083e1bf49c3e87ac6abce0ae0
33d844ddb651fa2688ffafc9a3df61d825d7fcc19fed4ddd01e7a2fe1796f2d827d0fbc4
4886fec192c5f343ffd80acbedaf16ff39fa7af19d3ee7aced38b2f28afda506ffacf384
ffc136f5d8b62cc754b2e081bedd73d2ed4feb87c1dc79cdf43cff12d287f3d9a529eb4a
d718c84fe041cced67dda5c947f3b895ed77d869efc860dd39d95bd4f279fad843e7c7fb
7ed9b643c40ec64ab7ec94ff1c9fed9358fe27f461fb78ff93f67afeca82f2cf43f05aff
1afbaaf2934be039d2b895ff6dd886dfc23784ffbe74e4a5deaf55fa29ace568b8fb803e
d8f18fdf61d912cafa9327c8a5dd1bd674edcc79d85adc0f9cde930bff90f4a6fa68cbff
3ff8b866de9bfb45a5ff099cd97eedaffe0354ffb3c693f18bffb67bfaad2cfeb916ffa1
d65ada08ffade445a0fe81f6b6feaf44cbbd66fcb7883ef260faa7ff8ef4abfb06de56c8
f732fdd08ddd9ced88dab81cb1eb2b9be560a5dd8fd87be4c33a8acff57afa82fe26bff0
2bf850ffaceeb14df435ff1ff09ad6b978c6f02f9fddff87c24bb6ed84ffaf63d8ff86f7
79ff57f53ab6f820febfaff25dfecc6ce03fde03d92a9ee4931afebe21cdb0e581c7fb62
f8974bc2e4f586e011fe52dd34edd00bdf98cb82e06fed1dff80e5c23388ffce1cd8a701
86ea96ff16afd91fffc09bd216e951e038d95ed78af0a56dd9a504ef51d819cb4aeda4df
52d2ff13bffa02fe35f6b578d9ff05b6c81bde62e358cbaf79e98ad61ae094d88dc0db5b
ff15e1fe0296fac250bc1ef7a5fd24b3d52cf5b70dd84ce49cd987dd68c0eb9351fb2de6
a549efb1d095fe86f2c35ef1aed086f778ff28f35bb5e02fcbf26c9d36d862ed9fcfa5fb
6cafff88f352f72afb93c7aaf44299d9f3bc5ae569edc6fb28d860f5d086ed6de22fedbe
93d0a5fe84f876fe26cdff46fac080ff93f5a5ff7efb6af4be79b3ed6dd981edc10afe4f
a5ee62ffaf88f49dfe86fab908da5afe68f60dfd62b4e97ed89361c4db79e993fbd769dd
7acbf95dedc16fee7bfeaf04c1fb26ff9f43c4e083d877c7fb8815ff52afe26bfeb54bff
39ed5add8cd893dd1bbfffa61cfec8ee80ffc05ffa06c3e626d846c1e092d9bf3de561cd
affb84119ff093fb3f8eb3e17ded9d38fe4fc9a1ff87f753fd23c8b810e6afdb79b1e578
dfaf31e056d938d005d9af38fbd851ffafd04c9cdf86eccb79da30edd03fd90fd839cef2
7deda7c99ed1aeed2ec5f545fcb6f750ff10d149afed06ff429fe09334fe9ee03ccef29f
5ee57af1afff06f7b0ff1badd8eb79c6f539d60fe0c193e06dd501f04afe73f69157ead2
79a50bcfaf25e088e27ab8f880fba001ff4ea6f987fe15dd57ecc5fe27dd78d0ff59c2fe
4abae579b6f906d744addd7de069eed68835ffbb15c4f31dfcca7afe89f996f286ff9fc5
26e0951df4abff6af7be21fbadf877b4fd6bf681ffa360fbc221ff51f94293ff9e6fe0c2
299fe080b4f299ff82cd93e4c002ffc5d949bff78853ffd393d817e060db9f37d994f242
b8f9229edb93ee73fb16abfa85ffa3caabe043d5fa933bdafbbcf84cfd6af336ff4aa5ed
62b8e57bd0ed0cd976f18bffa549d886c0f50cbcec1aa4d4ff0dceec86dd7bfbcc09f197
ff2ca3f3c75dd8fb9866d886b6ed10c65ce161d817e967f75efcc878e22cce3f99e49143
c1e012bdca99ed54e3bf3e9be58aec7bbfe008bbfe1c95edbe3bf4c823d937e061f675fb
b0865296fba724eccaac11f96dfe87d37bf2c86afe7ce564ccaffc7aff5ad09ac4ed35d8
be59ea14c3ff9f06bffeae5be479dcc59abed897c1dd18cdfe38f7af6bff9fc94cd128c0
f6b4fd3b94e09d78f9d9308df3af34ff4defb76cffb141ceaffb469cf79143c1ff3af148
cfa1e9b71ffeb6fa82d393d8b046f9be91efafff61d0fe935fff52e52cafd918feaff762
dc03d8fb6af3cb68d7f974ffd05aa5fe6df7a1ed29d84ed1efb7e414d0fe9538e6be50cb
aaed20fe4ba5ed28d2a9ff32ed51e509b6f62bff79affe25f596fb5e86e5afed6bd8952f
eeac12ff4ef21dfe75f59d5cdcbf21eab82dfcaee993e07b04a0d8fa5cfec44d93f1c854
e093c6a5ca27e587c5f964e086cbe607deaced70e59fff6bf779ffcc8745a8db3afe0fe5
9fd90bff50d816eaa00af1c5acf276fbcc7fef87dd25d084fead31ceaf38e6af4be30c89
fbd786dcae54c1fe86f2991eff7df3904cc1fa7effa5f136c0df86cffb62b7f90298d98d
d886caea78dd53c6e568b9ce6fd9b8f136d951f721ffcb59fb86ddb693d885e539c7f093
63fec486e35ff319fb50ffb9ed6bafcc2bedaeff67a5fa71fc15f662fe55d91ea0ed14fe
73bdff63f91fd9b708b4d828df4b9bf6bbf072ec65f27afe68b5cc94fbb779fad77ae520
95d9a206ff5cd779ff52f3c478b8ff7efa85fea1cbaee5ba2ded14ffd80bb6e53efec960
d831ddafe064d91ed886fb9d5af3990fc4e979c1e44dff1dfba543fdbfa2fa07afee41fe
2b91c1ff7bd088e0a8f994d8b93ef661fbc558ffac0effd8a551f279da95cba9d587e451
ff13f2be86de05cee822d9aaed93d8aff174fbd07adb5bf229afd893d07efe8af55afdc1
aedd31e001ff96c7a5d022c2fb34ed63c7f24cb6ff51bffe38f7c0afe72fed9fe5b23af0
da10ed50d214f23aff5298fa7acc5eafeb62c4dd7ab4e0a4fb6bff01f5a1ed5be008cdff
3bd9adff40b1fe69f3aec86cf2d6871ff288c0ff7ce099d2f40da6e328fec06e43ec03fe
93d5be09a4e07dcfe68830f7d306fec23aff4bf831b1d882df8cfe39b6fb519bffc039cf
4eff0e9de0bb4bffc0a7d394ef4dff35ed4cdeacec960cf261fe93d0b829e442ff98f16e
d885e126a5dd2ecba5ed71d061e04697fab608c86dffa459d898d98ce093d987edc346be
f193f880ff9d33fa08f651c1ed93d6b942c3fe7cf678b5e56bed75bce025d99734e6be16
9bffb3cc49e155d817fa5087cafb78ee9f14ddff9fcc5ef02ffeaff249fb299ffac16894
e0a46aee85e5c1a0fe25f7c046d4a2f079bee4865bfe7ce585bffb2693ed9602f83efe6c
e186dc9ffbbf2e87cdff7ad8af55fb78f7abed87dd4ae6adff5acffe84f56dfb02db85f2
8ffecb67df93fbbf1ac2f986ff28f75ffd66d308fba5ff1fdf3dd917beedaacf94d918b6
58fa7dff952ed0a5ed19c2fb2ed1fa86f180cefa62feafde3deb73fe9bf792f07edbffa5
3bda57b7f57ec12be687c2e077d987d891deb954edafff33f5ba0dd89b11f164e55ea9eb
6ddd20cffb1cd8edb4f32dcbeb69d4ff37cce881dfa5c60dfbb91ac87cd9fa3fb8e420ec
c23cbdd85ccb09bffd9113c0f29406e45cd887e5afff2bd81abaff36ec4cd995e525de5c
edaac91eeb7add85e06bcb9ffe71d6fb875afd67ff87e4c523e562f0affb48beff5d93dd
9e0dca50fe10a5db46f069f893d90bdd30ce45c6b51dd8f381ffd34ae266faa5ff1a9cfa
3dff15f661ffd108e259dd79d0ff5bface7bd991cbff08f793ff885af4b88e01a1dc973f
f7b67cddaf4fffbe25edabcd76f75fff06bee864a4ff7ff3a5ff19fa81feaf32c5fa9a3d
ddafc2ff23f39e3bc1e979f05989d6acfe79f56afea5ccb878ffa6c0fe50f335b6ec5aab
ef9343c3e523cba1f03dfe9ed0bc0ae06ddc81cbacf454feafed93c6b0ea7ed086d825d2
58fb7abcffa2fb6fed68b7c80887fbafb9d945d0afed69cc79eba8ca2499fb83ccacfb42
a5ed7abeff18fb4196d8b549b8e0accb42fdc5fa6fffaec90af261fc9ec777f65efe39f1
9fe594ed5aa9fbcb4cd80fd479df9ee861f2a1e54dd5ff7cfb43a0d960cffb934efba5da
c2f60d9fe02bd0be4aea0ad94cf2309fd992d0f603ffce20e0afff6db2ea2ed4bf85f24e
fb93c4ff20f83aeb05d883e061ff3cf557ff03fbafff79f1c4a5ed61e702d797fd2cf7a9
edc31ed87af184f835b6e5a2c53bf2afed46b6f31593eac729de3cb5eca5c0f36bfea5f2
0ffe81e66daf4ae018ed61fea2e42eed12dc99d986e054d81fcf84ffd61793f888fb95ee
59cb24d886d96aefb41ce55bbff786fea913e0afc70dfe4786bef364b0ff7bfb93f58de3
7eb8fa1cff5586deb978fa61f206d9f679ff60f90eb1da70ec3fafd886de95ff64f62dcf
a3dd7ad895e1c13890e09f3afe1ed885b6f24bafdd84e04195ff4ffb10db61cafe04f755
fe71da7affc96ed9ff4c9efb90f286d12de051db22e379d766d915ffc6ef86d693d9be44
b5d886fb59ff2ec9afff92fc6ae0369af0c231e050da2cf98eff51fb06feba71f6c48ae0
0ed843c9f46aff88ed7db6fad83bcbed01dd32c753ff38c3ed6cd5a5c0fb9949e7c1a5d0
8abb42d89db8d888ed37ffc1a0f36bfdb646b9d988b5fa19c0fc21f34e9cecbd10f9c093
e552ffcb79fec75aff6bcff387cb8de593ffa55ad990df86e810d89827fabd64c2e102d9
5cfe6dfa7bff86c89aff34f99ef19529a5fa58ff22f88cff6dd093ea7db7ed0c7be742f3
afc0fe51e5a1bfff7bc9a5d86be0bf9ccc2ddbaf33ffa5ee7beb82b6de26d942d0e51a93
ff779bf883b6f29cd1a5fb0fb0e54bed2ac4fe9330ff51dafe83fa12f34bff99cbb615e2
56d60ce0a7f113fec779ed86b5e06dceff6bf6d06fdd5daef39b34e2149eed25d8af0de8
37fe54d728c0ed73ff2ec6b3fb51f4add81eaff777ffafca1ce59fcd04bdfb3eafed86d0
54e1b6da35cd83e0b0eb05f14ade19cbfe79f8c0a5d28708ed6ed980f503aceb42fe0df5
a93bf75dff7afa93cf48bffa22ff50c2fd7af25e9cfbd458dfba43d9ff61e623db61bcff
85f979b3dc0ecbf285eb9b28c7a6e793bdd226f077fa8dff97f779fe7ee5a236e351ff38
bffaae29c945acff29fbcd15b9fa8ad4fb63b7f875feb6f19fbeed86fb18b8cea0ed62a5
dd80e06afed035dea140eda8c549edaadd6de8ca61dd21ff7ff96afe73f5a54786d9b9fe
66f6af39da51dd22fabaffa3ca26ff5fd0f16bdd86e17fcaed83dd93ed01e277fd9860dc
86e4983dcdabffc02eb7f611fecfae14c994fe81f3ce40d816cafe7ee5ad4cd816f8affc
3ecd5cfe69fb85e05dd928cc4ed331d84ecafb7bd998ec9311eda4fe93ed84e6bb66efd8
61e940a7e5cd3ce0c466ae01fa49b2d398f54bfa0cffc030fe45efb689f283cbf965ff87
f57dff2cf6b90bfea5ed65d409df9fe411d8bbfe9b38a4d885e09cc4ff83ec975ad849fb
a9bfe38933fd9fce47ff22b7fe17c556d2b0f218e6c3a5f808f4b0f90587d9ef66a5ed93
5cfba1ef3eafdf069ef792edaf43f164ff93f5b771e087ee7ce003ddafc61efeabf180e5
88ed9dff69b6ed09d25bfdcc7bd960d809db4f9cff9343febe86ff0993ff9d21dfffc593
c2ff3ae080d993d857e394cca5c609e551fe1098d836d90ed65ed89f59f2be4ac3fb8af3
c03ec2ff7df22ce5b4ef1eff4bfb03a9d844fdc892f182e61194fbb2c61bf3bc97ea79cf
a6e69ffe3ca3d853fe34bed167dd85e8b93693fec646c0e028d864ffcc79fbc75bdd72fb
96cebf2cdf5bc9ff4cd81cffabf79a45eba5cd36bfff01f6c01aaff226c0ff87deb049ff
1df8aff47afed706e0abca1bedc3afed4cbbf58656dc26e779ef66ff21f186f370ff16f8
61ff76d9abc1e579eeb6fd95f285fbafcf83e59c32d851affb934cdb68d180fb6dc7a5eb
93bfe573eda30ce033d868fecd40ee58ff79e561affc51f830f368c9ff6eed93d976ffae
25fe53d8fbc41fe28dff71f27fe5be1eed48a7ff27d13be00afd9fbdfa04a8dc7bebc255
89d0ff6cf883ed9f52dca55ffad87bdda54bf02bf6a5c3e58a40cab63bbff270fb86f79b
5bdb79fad077d9f385f99bd80bc7aece5fc52ad1afec83d892edbf2eff4bfba5248ae43d
cf16df43fe1ef7bfff93ec19d8f6acfe07dd4cb7f261d12bf752fe28c1ff79f9b2f24eaf
d980e0a5d92ef2c707d879de8fd8b627dab00efbb648e3be79f19f4cec80b8f405d1a5fe
3499fa88b9e77cf288ffa5f26ae979d097e532fbb339d9f128b4dd0ed862fec76dfbd087
37fe57fbc899d886ea5d9dd4ff6afad964afce25df4cd1f32ae4950ffc346be0a944fea5
f741fb9efea5fa3a9adc23fb429ef38fdc6dd0ffc358f97bff93ed7ab6d87f04ce62ffb7
8728c3e787ffce0ffe99e47ed988b6e04fd8a51ec799ff25fac10bbdfe549dfa88ffb511
fe5ee479f3cb61d6f27dfacf19e0c096ff5acb87e546c9afe06ad0fe18d861d9b84bb5d9
21ff45fb5ff2c569fe79bffa60c0ff87df14b7ed21b1e6aac2e09418f952ff01bffb22b7
ed0faaff30f9b579ff83b5fe57c0edaacbbe15ffc269e07adc89ed05e079caf24fe9a6c0
e161cd07edb839ddabbfe030d860c9ff4eefabe597d959c8ed9654f33393edaf59bfff17
d0f97af286ffdc6ded7be59f61ed7aceafe065dc38ed94bdf19dfb429fe79412c93aa6ff
84fb0facee38fc95f361ff10f64c86e2aefe01e493fe7cd587edc18eb816d8aded07a5e5
9651ee9ef57cd793ff4bf70586eecf7de375b3f27ae585c6a0e087ed7fe7c238ea11cca4
ff8a4afee1b275edb61af2bf31d3b952ffb66affc25efe18f67bfe5b9bf76ffe0588f0af
fb1192e087fe43f527b3fb6dffbfa5c1e079d8fb3ea9ed943cc614ce45affb05d84cd0ff
8bf63aff19f2afcd62fa41d01dc6afff2cf6afff89ea5cd96ec3dd7bd9b61cb8d883dca4
c3f0953abeed60f42eec5dddaf0ccbff86f83894ffd23bfbc92ad84cff39f274dd89ceff
5fb6fe3cc2df31d84dfe35f354d860d304fe9fbffa62d92fe5d67f5cf6d82dd0ff5fa5fe
7bf697d813d9b003e086d897d793dfc01bed9fc5fa9847d0a6f4af24ccbe71c4ea0de041
d91afe49fa21a1f2cb6ffbaffe9cf5ba65c0e186ecaf1cca5bdf85d89528fea4c1e88cff
86dd6bd85ad843e0aff231b5f826fe50f59ffe2ff9b543ff20c0fb81c7a7cc9ac0f737fe
9ff347e69fc1de4e88edb77afe6be19acca9c715f042afda27d8a5f583ff95f0a5dc6dff
22fb8ad96fe04593f07af8b103fbcc3dacfc5894e4c24edd1de561c5f572fba3f240ff27
f947ffa8d051e760c1fe86e953d7fc67f99fff79d199fa81ef88d46bc2e58909e055da61
e337d8fe2896ff36f4a8fe9bbff744fbbe58e0087af34ae504ef87fe7df7c10297fccf62
edafd286e95ce36deb93cda5e852f21dff50fa11a5d87be06ab2d023ff81f2afcb17e493
f4b00afb5cfe9ebdf971febf8bed13d65bcc19d880ec88c9afed51f2acffd21fdec36bed
a1fe96f083c8fa09ee87c0ff86f99f45bed131bacb69ed86d979e587fd28b6db1cde3bff
77b9dd13e03aaffb5eaadc52b6f79dff5abfff97f222d886ff79a5edca69d886da48ed02
a5d978d0f486ffd9a5cf75fea5c51dedb779fed83d91de9f44ff0cafd992d003f261fe86
d979dd7ee285d8fd62ed1abefe75ed5fd809f971ff53d827c6f17ddd32ea65d8b30ee050
adfc96f792fe5afa08b7e5409dfec41884b8fe983effbb2688dd0fe047b6d59ffb3fafd8
26e1afff79fd82f7a9b7c814f330d965ccff79f76bcbacef339ff283d8ed25c1ed14ffcc
05d938aff630d27bfbaeea01cbf947b5f715fe6dfa92ccff5aee9e37c94cc020fa9cca51
f9a8cb2fe54daac6ff0be5bf94c4f72afb7affa8de2fd50cfe9fcf26f0af3cca85ffd632
df93fbafe55adca3f280ffa449e5afd095fb28cbf67affc92dd83fe075dd8bcff67affbe
2f8fd9f15487ecacd05fe843afff90f378ff29cc9bf279fe8eee19e853dd09e04beba0ba
ff83ef9e0aec95bffb0796e0c14cffb76aa7ff77c6af86e579f1d076de68eca04ac1f19e
62e088d3a4c6b723e262b9e517feaffb93f0b55fed32dd6be284ff88d5fb67a5f27efb69
ec79d855e0bf50c2f393e0af44fab759ff88f5bb4a98faab12c84a9dfdb532b9da60d1fb
931bff4ec0ed9346eab686e579f1a6c832ffa448da11e4c8f94abffbd70dfd81f8c1f2d0
61d91de082ed61df0fd83cca5dd887cf9eff93fb7ffa62cab040fbd8ab36e556d8f661fe
88cb08f2d03ed8f45df942feb613edb8fd0cc6ff8733fcc30eff3ae452f1d681fb35a7d9
62e00add67ffc194ffb0fc0ad85beba113eecb5ada19d84affacf49f24fb9a5cff73eec2
70eac695e008d9ade46ccef67bffd81bec89fe04edb138c1ed84e5a25effa8d109fa4bff
c003fbbe68e8ba68fa9752a5e6932cb2e559dd199f8632f5affe51c5a5fab4ff6cf686ff
a4fa2eee51d223d83be30df7c25a88edbe81ff7bb6ce1ded94fbb57be5ac2fbed89ec781
ff9449a5d95cddb9d86be6b680ef94ff9040f398c5ed86d27ef29ed03ce513d54aa1ee93
fb27bcdd952dfaafff86e1c01487edc579edcf39d818ffad04fb33c4ff5cfb1ff14eb6ea
2cbc84c7f35bcd77fe99f956db08fecb1ee062ed9fd0b587e87cf3b117fecc85efb6fe02
d0ff7cc0f270d8ffcbed9a68c9aaea01c74b94eb9cd608d962c788db7ff0a5ff8ed879e6
b7ff18f9c523ee48ffa5c65ad62af761fd95ff1cee4de035dcb2fe81f9981fffaf44facf
6ed808c7e5af0fff50f726ffb02aecb67af786f3cc72d97bc7f859fed09247c2ed3798fe
d13cfeb40e9ffb8adb65e0c07ce7a374de93d28bff7acaa4edc13faee096d916e086cf9d
f279b1f781fec352f423fe47dc29d7ed9e3be01fd881f2a550ed38a3fbb84ea70bffd82a
fb5cf781fdd02de053ed7bfea5f711febf6ac1f251fe2593d8ae68e1af8ee586f232fe80
e095d803de8de879fba5f868f01be63cc4f37acef2992afe5bf6a54efbc17cdd93d85ec7
fa85fec756d9af35fe1bf19c3fedb761f1d9956dfad85cafe469d8ffbe4df1b7f63afeb0
43f9be28f352da02e444fe61f894fb24ff86f6bf30ff49bfde3ad8be3494d980e06bcdaf
ff864fc2fb93ff5dd93ce0c395fed90793e5f7c05ab0e28fd894d938adfe7cfbb1e021d5
59e0af43e601abde81cbf439feb83bfcd102d860dfafee53ff85f3af57c5a9cf09c9bb92
d3be93e04deb1587ddc1a7dd7aedcb66e0b61dfe77e5974ede10a8fb21ff93c0e367ffac
cc1effa607f7be22b5f106bbf64687e5d58229a0d886f2d169edca78feb7ef85d895d80e
dc56d463eb45a5edafd968fcac6cefa7ff15fac1a3f25b98f7adf16cd079f4a9fe65f71a
bc60c2fe3a6cd9a1fa77ff20ef60e6bf13c9bd399af392ff7acafb85fed032fbbc79dd89
cff263bcfe79f89a0fbfcd22e069d1fb31ff62f558ff2afa5dff70fba5bfff40fb12b9ff
26adfe2ff9c09ff206fdce7bedd779e060ec43b2d104e679e086c6e566d7ff7ac3fe73cb
aef81d99fab4fe6ddd19b7fb0fafe09341aaff25f366ffb0f188da72cbfe890efab621cc
ff04dd60e3af3fff09e5bf37e00cd930e7c114bedd7ad6f08fec79ddff4af213db55cb9f
ff86f4a4f16cffcf5fd941ed2ea5d84a96eca40dff50f00f9ee542a5db37c9ff7afaa0b8
fe18b0dd88ed93d87de0a3ed06b8cc27d969e093ed71cf9ce088d76ced41b0daa538ffa0
2cf2bfa5c4fe6dfab787fc56f940b6fd3397e03e9fe82cdf5fcaed4bdd0cee5aff79cc9e
fe30f8c6e85dd091e1c23ea0fe0afbad29c8e67fd3f379b6d793f6b979ed66d978fe93c4
ff87fb4ea0ed932effaf43ff2acf9eb3e487d293ec79dd07d04ad827dbac0bfca1f586b9
e56af2c766f8d687d97dcbff6ec2f586fbb14bed30e747cb9ef64fd51fde41f2c078cbab
f47bfe92f6ad57c1f846fc0bf24ad980ffcb5ef8bf59c1fb9347f90d9bdc3af2c82ed99e
ed7fcaaff365fbce85ff93fca96aff85cea6c697ed38da61d8a60a98f777fb1886edd079
e580ddf59f50ff34a1e042f24cc62cfbbf99c5f51cd851a5df73cbff60f9d280e098c7ad
f91ec735fb7bfe2ef6b5fb6ff964fb7df4c566d81ecbfa12ffbd19e03cb6f324feb52caf
ed12d85edda4cfbb93fe6cd986e27afcb6ff9f12fe48e837dd4fe502d5fe2cafd987d279
ffaee51093ed22dc95e161d3e480edcf8bea62a5ff84d818ff52ea0bd8a620f251d402dc
c130bbfd45f724afff90f482ffb6d93ae0a9bfffa524f84dc63e87d8f06cc6f962fec08a
ff9ed10eff3aafe480edb81ef3ab0add9e47f304fb5be47eed94e0b846b6d8974593e3a5
cc94e03c9fee81ff5a9bdd7799fa86ff6dc6a1d254fad885ff93f31cfe52f705c2f23bff
0bf0aa2d86ceec6ad896ff85d0a3f161c697eb62e238e9c02b9afad469ff88f501ffaf1e
feb658ff22bcdd0fed6be498da91f980fec779d988f46eeb9fe079d88ae6c94de01eec5a
e579fec055d935e0c095d9ffa5fb1eafe3950cd89b17ec62d970ee86e67ac1ff44facd58
e2c06cfec1a8cc76d816fe52ff05f2a5e50effbbed33d917ff57c7fe27ddc1adec46d3ed
59cd9fe54df77af1bf5ce434c967e383d899e07ab4eba5c75ac0d9f953bcfb81db11b7fd
28b8ff87f517ff9ffab57afec54caae6c247cfb578ea9ec832dd79cbfb6ff7afcc4cfb2a
d157e041b2ed17e59cff14fa4ef319fe5aa5fa7ec5a5d030f1a310fa86f57bfe5eb713bf
da84ff45cefe79e5c4aef822fea5d953fc27a0dd7999fe80f7b425ee60ffa5f596caaf87
d083fe68efc475c0fe81f28feba870e59506f787fbb722b4fc06afff1de0a704fb76b5fe
9fc1fa33ff5af425d062fb94ff459ae5a525f060f7c874e059da3dcbb1c453c705f361e0
86f216affe80f0be51f67cfd96f5a54ad89e32fe93c1f271ffbfa0f686ffc344b9d093c8
a5df7bcded07b6f76bffbd52c3dd96e463ce02c4ec8ff15ad09fed68b8ee3afd4a94e1b6
3dbbed86c5f802b7ed2bd93febd091d920e04ded39ddf75ddb30d8ad42f91cafdf4cd103
f6bc4affafd634c964ffd877edc788d85bc7ea92cfed4cda0aa8e08ed681ff95d914e787
f2d102ffc98de1a552ee88f9bf82ee32f785fe93d8b91fffbf94e03add24fbd010d953e0
07c0ff86f3bf63ee01afe59412dd37d953aeed7ee230ff61befb3b93ffd848dd14f389fc
79ff20b5f3a5ff69fa32b4f405bffa28a5d885ddbe5cf593fa12b5e06ad2ff64caacff88
55fe79f9c08cc4fc6a25ec89fa7dfe93c6ec6ac1ff7bd987fbcc68db7dfe8df1a552f495
3ce56cee9c42ff279dfb88f2bf51f016ddaf3ff9a6cb28be7fef874dfc2fbfff1ed8a508
fe94d8a5ea3ee44beda4d054fe76f7a4cb5cadff91f384b5ed3cd619dfabd08bfb3ecafe
7cfac193fe21fb65f1afe704d8afe4679efe80cc9ae02dd85bc9eb48d83bdd9bc1e452ff
7acaafff53f701ffcb1bdb79cafe31f29847befb1296e5bf0cedb262ff0fa5d8ffa3cb4f
ed16e25bb7fa399ee05fed30aff21cea4fe40fc3e028d3f8abfe2ff5d07be0c21ee579ff
97c0fe55edc27eed5cdbfe3baee0afd09cd979e569fbd8af51fb15bcd29aff7af76ee82c
d9c36cff9ded67d831cdff79d993fb5aff36e079d9b14cedb507e061d9c5a5d8558cfe86
f21ec7ed25b7ed4daff894ef739eff86f7af18fe74d997e81de07dcf91eaa366edafff4e
9ed884dbaae16dcef142dca4d32be99cbef379c108e5b99fd5afff0bcfacf11dfdc293e2
75fea4d0be93fe79fbb68613c1dd81b6f948ffba60d229e641b4cb8cfe31b6ff9b67d8fb
61f50efe4afa9ecc4489edc87fe078fd22b2dd0cc9a7fbaf09ed43d81ce5b9fa8813e661
ed7ec69bf2a5ff1ee797ce6dffa3ee8642ff0df9cfa843bffd5c88d6f678feca41d80bfb
c726d752e0c593ed2dd864fc5ff131dd4bd5fe9738d2aef45efb15fe39f7b679fb86ff5a
f6c649d939df52fb65ff28f44d9be577ff86d8b146ff13cfb862f530ed43afce5bffd9a0
51fe09d8af6feaa5fd93c4f766fb0ed0a0e508ccf8931cc794ec82e4b419f4afff119fff
3bf0bf90fa68b6ff3e87e196bff990fe85439fdfc2a5fe25b7fa0aca4abfef5ffe26f2c2
3aaff8bf9aecb628f0db75d1adfb9f3cde02a5ff92e64fabfd93f26bff48affe8cf5a5d0
86feaffb8626c1f962ea0dd073edc087d824e5c331bee19476fe85faafeaa7d193de6dcc
fb86d826dd62e89cc9a6ed3be08cff9ec0f202e8be70fac496ed65cbf212dc50f301abd9
7bde58ff82d9b745eeb0ff3faed82bc6eb7cd965d0ed6cafcc5ae045cfed79d7f35ffe34
c650b7f1b3ff2bf948b3d0e252e992f86ba5d888de9f5bfbd51ae05ccb7aff69b8ff39e0
11beff81c1e47af26dbedd7ae008cf9fbfe50ecb42da0ae59d15c6f3ace57edd92fe88de
af4bf494ff5aa5f89b03fbc123e5b871c51eed49bffead31ed5bf598fe07f359f881ffc4
09d861e37bfe9d35df1fe846acff2bb6fe9bbed786ff2ef193ebc03af38ae574d96bcdfb
7aff964ffe39f8b233d8f604fe94f49f2dfbb81db4d093f2a5d905e468b0d592ed6a96ff
7adb23ccfc0ff446bae59370ff8af335e596d80e9feb86f7d84bb1f358d826cbfe1bf65a
baf936fb74d885f27aff6ebfee934dd905ff33c951f22eff9fd106b0eed06edfc46aeca1
d016fd5eff86f89501f1c68ed8b644b8d592d829dd4e97eeaffb22d951b8f693ff7bbed9
86e076ce34ed45e5b0c763fd1eaffaa717c2fe24f3a20bdd55edc986e0bf77feb67cd962
d816e0afca56ffd94ce614ff61fb93c4f45bff03f5c729d89fff86b9e47cceff0df5c92f
dc79fec34afbbef557c93184eed01effa1f95f9ad986afed6ddc95f04bffb7ea3fd5fb5a
b8fe7bf2a5b9e99ec0d966e079fdcb861aff4df2b33cff80f299d979e038c3dd9e4bfb12
ffa9f77cff72fba5bffc8648c1eb86caed61d841cdfd1af860f493fb87ff9a5ef9a5ce86
e04dd4fb5a9fd753e0c0aff7a905fba618ecc325ff99f382ff6af888e5799ff67ad880e0
af4ad917e39bdd50b8fa69ed5ae039a5fe6199dd52a9eeafd30999ed9161d193ffaefcb9
62e5bf76d4afed3affd42bffc417c1e093259fddaa28c4e632bece66fb45ff17b3fa25f2
a336f9d891db86fecd60e047ba2df6bfaaff6cfecd79e060ed24e438ebc25be11bd3ff95
38fea517ff83f3af5beda8c605df51d810caec20d944fe95ed77c6b1f486ff79fa3387d3
e561d0f29b5ee552de39c7b0dc3dd801f2c726febbed1fccf67afec165affb86cfb115f4
72fbd82dc5f079d0fb8647ffb9fa26c0ff1bdc4ee30593fa9c4aef13fe85c8b779e7a060
fda55bfab1fe5ff687ff6cafed1ee087d88be47cc2dc5ac7e6af47ed2ed80aa5ef8dcbfe
ed930fd957e51aa5f793d184db69ccb30ef281f7a560f1ce6ce0bf98dd0be19fca51ffb6
7cf9a5f384baff7fefc10cafff31e703dc3aed93d9ff4b9eff9245fcd386fac093fb28a5
ff6efbbd68e0a54198ff943adfa82ff2d61de041fed99cc9b682f7ae1fff9e01c0e39353
d8a6df79eba5f899c1dd34cdff89dead51fb06f54ebbe37ef3cd3ded11cc96df07d1f879
ff5cf60ef15afe3eafff9367ff96c1fe79fabf34fb129f53ccfb88f384b9e028d940fec0
9efb78ff9bd92fe0c011aff747fc30b2fb64ff31dc79edc729d855e03ba4e05b9ef7dd60
d893fe81cfb71ac36ceac42ebfdda50aed9819e45ed2ee7de9a72cff86eeb6dd54c9fd86
d0fb9f57ff79ef8fbe4dff05ec4be0c751e9affe33f6cb81f23ffbc335ce5ffe7bf4af0e
ec43cbf188db93d0fe34d803b6d96abfff43acf39348dcc394b7d8a5bccc94e008ecca14
e061afe550ea87d4afddffa74ce42ecffa67ff7cf2af08f243e5ba51c4fa70fe9fde87d5
7eeacc86d87be89afb399fff92fb79facb18ffd02c87c5f857acf06bff9ff2b910f986f5
6dfeca72d8ffadf19b0ccd47c1e05bd907fb6af4a50eed4c8be7bd80ddab11f9d288dd96
fe6da4fa80d96adeb217fe66d8a46cfe86e823d651e186c2fea423e558fb1b86f1afff79
f99fe579d8ed5ecbfead29fb4eff3cf420fb6af752a6fbb6f123d0b89aff5ef37d04edc8
91ffaf42c6a5cb5ae793d3a9cb21ed88b1d035ed52ff07f4a54df125f9c00dd0b1e44ae9
08d3b77ceda967d9feaf16bfe229d850df3dfea5d1b81ee15ab0f84abe3284feaff793fe
82f093d17cd830e0c07dffc50bfac42cffc58635f254d825cbed12d541f8c279ed9fe104
edbe16d8b3f26dff94f9507fd8ff6dd3a5c2ea9e4593ed2fcf1bfab220fbb610ed9fd0bf
91e179d59dd884cfed864ba2ff7ef70bc4e037d8f8b924e060da9ef005feb632fb5dff7b
f761fe04f3b77ad893d96ac6ff93dea562f35afe86cfbea2ee34fe4ebff29343ed9cff79
f5affb86d776e042ff96c2f126db93fbd9c255e062dd13ce38ff4df7a4ff6ff9b02ae2af
69f2af60edb7fea6e67ef5ab58ff86edaa25ffbe59c4ff7df491ff46a5ddc031d9baf537
97c6f63bff52bffcc565bcfe93c769e3c17fe086f960ef02c4fe4bf219feb92dd8fac241
dd66ed54a8fe9161a1fe7af213fb6fdd86edbf9ce018d893dc81e567c7fd1df23dfbb60f
d844fecb8cd9ad1ef761fe6db3d896e506fbc864d835dec10f99ed22fa93ee79ec4ab6ff
62c70588edb524ffc0a5fbb99feabc18c4d943edb86cfece4bd8e59545d917c0ff3ee3bf
94db5cfc9ad82efb973cda51e0c180fb06affd9d15ddaee90884b7d880e012dda7e05aec
3affa436fe4fd832df93fb83afdd7de5a55fff9f10e493c6fb90bfde74d8e5c146d1adc9
95ea52d622fa63c2f555fe3bcbadff43a5e0bfa2d087e579edbc1bff3bfac196d824c1f5
14ff86d1b67fff92faa84cffcf61d95acb01da9ffd86cea3f4afff3cf5d09641e85ade23
cb86f2629bfe86d3ed1ba5ff8908fecc7bed64a2d97cf32bafe507d089f375e7b886fba6
2bedc589e071e5c286fb62fecaf222fb9af361fe09f79eda86f4d06df2a5ff7ad75be530
beff43c0f17bccf561fe1fb63cfe17f52f7aff89f92aff43beff93d97de439b5eda0bcfb
1795d8f98657ff26f74cfeaf7ce598dc84e553ff89e07ad9af54fa39ed1ce071cbee7bb4
f785ffa5f35fd834e00fe448d875d89f65f9d87af193fa6bfe40e5be04e65094f7d83fca
f4b95bf893fbcd08fe61c4ff70b7ed46addc11fecc1ad3faaf4aff27f350ff3fb5db944a
92ddaf43b8d890cb83d672e60aa8e5c517c0ed26ffb6f76acd93da04e94cbb87d3a4e8c3
95d0afeed80adda5ed7ce2a50df14dffaffc68cd0ce05fd8f5882ccbed7ae065cdbf25fb
5cd868f214cca5f04bfe41f4cb8edc9ed752f3049fe11dbfe02ed889fe7ff669fa80ff93
f212fbc91db6ff09c64cd8a1db77f3ca7fffc0269bfb932fa5e423dc3b86eabfa5dd51d0
f979ffce61eea14fe49561e593d8accb93d8a3ed2af7c5ff5ff886ff28f24fff24f154b8
ff3993f89c61dca30f95e021fc5ef8c196d9ff33f372ff59fa449d6af6c352bfd95ef4cc
81e0c21197de86ff7aef9e4ac1ffae01feb8a4f382db8aed07ffa4bbeb2eb7d09cdf8621
ff61f774fea5c2fc6dfe4da5fb52e616ccbc9dc4da2acd5de0b48aed79cba9f58cff0db8
fc30a1e036dbafeb51bdf1d879ffabc2ff9c4afb1ceeae2fc9b51efe87c6f779ffca0df2
5cfe66f710fb61d8af1db7d60ced99e07cd894e08afbd360bfec51cefe79f3c7fe79f0b3
dea03ffb0eb0e05bd801d979c9fdeab686fe1a9bfe33affe3c9fd8f82bf2a4c726feafed
6de49bd33ed913ff4af8a8b9c93cfd67f75ffb03afeabfa8d00deaba34dd55d888ecc87a
f2bfa9e446fe1ea5e67bfec054ff3de550db34e0afed5dd0adff79f688fb70d0ff8641ed
bf5fe00ed6f18fe47afe99f568e07ad926b6ed36bbfba5c520eda9d08abfff79ee6ce5a5
ca3eacfe14f958c82c9bfbd975ff06afd837af49d8a53a86ffd06bed79befe9eed86e5b1
1fd036e064edce7ae5c767d2fb895abdd241e6b778de0fd850fa90ef75e488b4cb31e779
e093d685e393c4ff37f94ef196c781e593ef24f8b608dc9928ff5ff193bffb6bf4af2feb
86d680fe95fa834ac3fb84ed11cd56d815de9f02c2fd9f13fa93f677be37b6d815d94dec
a6fa56ff74d7af65d93ae7a0c73ce449ed02cd9cfe54f574fbd06bddc0a5feafed861db1
d996ee58fbc5f566ffc6ec1cb5d995fa21cf40acf82eff9660ff80f9aa4ff2a017eba622
eeafff75fe65f9d052fb81f2c318bbfb42c1f079fa95fe5af20cffbf28ef6ad88be076ff
2afa5bff79b0d06dff67facb82ddaf37ea52d608dd9cc4fa03f2b527b9d3ff9820df53d9
8af17ffe66f2afe06ccce977d957cbfb94ff65f384ffc30ac1ed90e101fecf92ff7bf66d
fc96ffa2b9f935c8b52fe7bb1aefb34bf301e44abcf3cb55fa86e28e1c9fe009b791f45a
fe31aee082f2c968dd7df0c7a8d805c3ff2dc0f887ffbf86e50addabca1c96e9acd7379f
ff7acfa5fe0add51d819cf9cdd4ea5dd81d943fe0fb4ce9ed8b815c2fe40f097e443a1fc
06d0ff7cdc95ed83ff5ca8d859e0a5f01088f3cb6dffb8fa39e5afc84cff27f847b6ff2e
f2b11dda48e0a5cb3f93e59f36da6bed9d2df253d209e0b318cf5be088dd7affd49e5bff
c47ae088d87eceff8d3be0b627beffb2ed85d0fa46d6be93c5ef4affb917feafd712f749
f28ce572b2df73d852e040c2f59333f1afff8620fec0e54cdd2aeb61cd87ff84f66cfb79
c1fa58feaff299c0fb5fed3de8a7d983e0c00ed2afed62e56fb7f219fe4dcf22bfef88ff
73fb7be6c144afe39928a7dd9623edba94d988e183c7a5d36bff9ff7ba03fbaff570feaf
c0ff4cbcde86d99dfe84c8f985f222fe50ed0b89fad8af43fa23ff64f29f15c1f77dffa5
dc4dd72ffe52a6e57ff612fc78d9669ded9348fba279dd99fe3fbefa5afe02f393fc9d57
d0fb7de05ac7ed9369b3f797ffb794f4be25edafe032b5ee12e69f1bca52db24e086ff6a
f64dfb2ca4ff86f730c8a5f947c18fc7aaf5a2fe3be51fcb4ada37fea5fb02f2b6fe78cf
ff61f73cc0fb1af353fe07edc134ce7eed6bdf21d651f2228ecdfb60fe1cea67dc52a5e5
6ad87dd094e0c13880eb94d8bf9ce736fbaee562d810f183f974e97bcaff26d961df99e7
06cdfb39dbbe63e0fec01dd0a5ed15da84cc62dc2ad8ffbd4cd906f3a63bd8f204d157c7
1efb43e2a5ca439effd25cd972ccfb7de579f4aac602d07bde93ccf35ad879b6ff12d886
d9fb33e062d889dd7ab6ed9ac0f265de7bd760d849ea0da5d886e4a56fdd99d87ae0b05d
e592ff55d09bff88e47ed1f69f13eca7cb94f527ffbf3affb0f540fb65ffaaf704fe5af5
47b6d771da2efe9fe460cf0bddb8f71396ee89ffc34cbfff86b8e470ffce28ad5ae26bfb
81d69fed93ff7af2b01388edaefd77ceff61bdff8bef82e566d96dff7ef2c20188f795ff
4ab4ee30ffba43f19ffeb712ff63bae51afbce69ed94ff23afee82ff13f84ec7fb61ff16
a7d82ced93ff8ef585beee3afa06fece4bfe31f8c586fe77f026befb39afd810fcb645e0
afc73df14aafd780e096ca13a0eab6d929e087cdbc91d0a5f90bff94edbe47c3ff8ffca5
3d9ce0c057d137abfaa354f221a5f40c9fedf887ffc52fde51ff36d41bbcca6edbfa9749
c1e62793ed9f46df30fea1d0afed11d860fbaeebbb24b7e17fd4a5c78afe69d848edc98f
e03ca6ed9d32e0b341bae379cbbd56e57beda507d593dbf779ff5ac71ce03ccffe6bcb9c
de65b0ea81d7a647f213b6d2a5dd7ac9f962efbf79ff86fa79ff83c0fe5dfa0ff358fbd6
87199ff2c152ee3aff1ee079d9b63fc985fa932ce579f0b5fe6df3a9fe84f01bc4da7aea
cb7ad9c143d2b809aff68ae97cb6f4a5fb3ffeb731d6fe68a3f9d815cafa7ad8af0aff2f
9afa91e533d851fea5f339fe06f753da14e581fa9b37f284fec350bffe86fa9ff550f909
fe9fcdb637ffaff24ebf3ab9cda0e9b572fbaf28b5ff79b8f220c0f60cffbf96c3fb4cfe
0ae89f29e0a54aed07d843dd25b5e406eda5d97be0a962f0c4fe4aadff84d899f187fd5c
f489fe03aef1cc51d81fd94cd831db03b7d993fb3bff9929fb52ff9332f1d97aceb50dfa
c645d96ae0a059f6bf0de0c342affe79b6ec5bf1c66df3c047ca79ff8fda85e071cd9fdf
85eb7afbaad021bffe5ed709f793f25cd204d96dd68ddf86f21dfed382d971cafa87fd0d
f34dfec0d95af9d818e04ec6ff9a68d989ec2be56bdc92f259fec670ffcb87dd7bf388cf
fb61dbc375b9ff29c0fe3991dc7fd81ced61e566c62fd0aaea53c1de5abafb84ff94f788
ff7ef9cb44ed87e05dd3f1afe384ebfe9c4fff3dfbd85f9cfe90f107d0ec9474f385ff87
e14fdd21bffc369ee086dca5feb81bee40fb0fb3fa67c1ff36b6ca5aeda2d980dd95e96e
db27df78ffa5f125fcaf42c2e09351f62bfea11aec96e07bd8950592ed9a61f5bdfc862f
c3ed3cfb60d8a4f732cc75d887b7f21b98fb36feafe65193ed9e34fe48cc9be87acefa05
b4fd9ebefb0eb7ff9cf816cba2f371ff189eed63cd07c861e0ac5dffbe0eaff8bf8d47c7
02b66ac8e686e0976ceecc1fd879febb28ffcd5ada2dee9bf685ff88cbaff94bfe05f15a
e3a2cbbd6ac3e540dd1f9df2d827ff88f54df91cff4ac8abff86ebb845b5da60cfff9b61
fac19ddd66e1afd045adff2ff7c6ff40cbe9a24493e5adfb87dd7dc6ff5aafed95ff16f7
40d9b0e36dd9c00fa2ffc219f9d886f16afb0bdd52bbeed057e032caa5de43d878e586fe
27d886e0c32abce593edb42af19ed075fed88614ffaafd94dafb18a5f225c2ff2fa9ec5a
e4af82e0a61bfb93d7b604b8d55de80fdd6ad896cf7cd836f95effa8f688ff94f0be4b8f
e4b30db8e07acbbba3fb0fceb12ff793fe7df4950eedba2ee902aef340ff6dfac061e5b7
74b0e4860fffb2ee03d951d31df2af07c1fd21d97ce069d08bfe52f6a55df1cc33f4b26c
bee51fd9b4f286ff984492f293f77dfe70f4a8ff52db6aeda5fa45fea6f53efb4bffc253
fa23e59f36c3e561eb2af24a79d6ff64b0dd78b8f880ffc138fa50f4c77ae445fea8fa28
d994f280ff2be551ffafeb77d909e02dd85ad061fbc6fe62f39dfb3aafef2df379d967fd
c45ae212d839e7c978fbd67dffc88cd883dd0eed8ad053ed1fc2fbd668dd79ff9ef485fe
56e78edf81d052fba3beff02a8dd1ed1ff9a64e07ad2ff3cafff884ca2d82be6c1ff13dd
50d724e2c206bfed33d5b810b6ed7fd96bdd9ad079e694d8b66bf6aefb88dd7fcfabe0f8
b939bff703fdca47d9149ee88ed9b962ff94f27edc68ed79fe54c7a4ed84f3c21793fe95
d484f16dfb19d99303a7d83dde88c1ff72d856e597ed18dd9cbdf6a5ffb651e09f47f1b5
37fe20f8a5cb9bff16f593fe9f37aff132d8b741b5e06ecaa5fe42f16fe1af35ed58e5c9
83eb932fc1fa91ee03a1ec5bc5edb8fe6bf9b577d8af73fe8df05d95fb6c9ffb80ff95da
5fce08ffaf1ef8b210fd61fec94fd91aed3ebfff59992687edd879e3569bf489fbc94aff
019dde36d810cd4dff9ecf3abdfa1dafd93a9dfbd027ef4dffafcaa5ed7ae5b6ee79ffc3
61e505db86feaf39c2fa6aff3fcc5fc686f21effafcb79e566edb951fb5cbfe086d86cd0
f87abffe62f78afb11bced1cd29ec0ff0ef5c293f8b638ff63fbaedd1bd859fdcb7dfa95
12e039afcc1cfb40c9ed37d9b6ffc63bc4d921e14cf238fe9ce083c6ed67dac18fec0698
f28bff7bb0f30cbceccffe9544ffa5bfde23d866b6f179c1fb50f8a5ed87e0af18f2a5df
70cbff79f7b760bee47ddc9c14e751bfff49fa2fe1a518fe95f9a8eb1dd0ff53a5d988e6
80fd26fa6dd962ed0efbc3a6d081dd2ae4a53ffe25ef49c0eb139fdc21e3c599ff4ff788
fa2f96d879dd27cf60edafc748f075ff7fe3b151de2bd8fb84c3f063f39de986bef88117
86dba5f279f7ac88c2e67af155fa33a5ff3af24bceafe138d84dcbe466d2fb6ea512e5af
cb1df282ffa0f70dd3a5e56dedbd6cc4fd2cf7c188ff09ee9945e107d8f140a5fc31ccf8
92fe34a5d886ce5af7b1d258c943bff66292f1bf31f201d88fdd9fe793ce87d99446ff09
f560ff88f3c87eda9bff935cfbcb79edaf3bde80d8ac61daafed4cfe9efb81ff9612e19f
cfb93ff3be23ff94f4b647afff05d97bd75bff01a2e0b0fa4efe0de059c8fb05afd325d8
87e4cb79df9bfb7bff77f59cfab821fe9f41ddf3c165fa8afb6beb37cd61ea56ff2cafd0
1eff419fd85aea48afd862fbaec1fe6690ffc55af3b662de79c4f50cfe98da80e02cf188
ff78a0c7e40bdf9ec1fe5bed47d207fc33ff58f6bf9de487d579d903b0fa4fe50bbce1a8
2affc186fe6bfa27f0bf01fd6de5ae1bc1e040d2fe5af709fe98cb86edc260ce74edd579
e5acff27dc6ed2fc5aef93e5bf93b9ff3cd998ff74f66affae0af9ba1dd5bf28dea811d9
87ed82c6f97a34ffb52dd952d287dc7bfe94dd86cbfe80e587b8f377ff96c5fb7ae522da
4f93edbf0fea99d386ff0ab3e36edd61ed14ff52fb9ad90cd8fe2aa9ff7af849b6cda5ff
6bf2b1d6a3e01fde5cc1fe23f0b6fe67cdb683f4ca3ff2d8974af209d0a5e55affd086d8
3cccf368acf174bdeb86d86be914fb48a6f70effbf24fa9744bfec88f4af3fbed026ca33
ed63d3af7cec50dda3cb42ec95d76cfe52efaf64fec16fff5ada04abe6d879c7ed79e20b
feaff31bd132fab410d95fefd005e0bf13e532cda0f880ffd02de0b077fb1fed52c2f23d
ffafd093c5a9cb74e565eeb34eedcc59d893ea71fa1fc1df9855f979bffe86f332a9d895
47a5eb1cffd665a4ff8c61e6c47abaec51c8b38f32f59cff85b8fe0ac2fa2eaddc37f9b6
db6ed0e77edd9f66e05acbfe934ffb1fe39cff7af982ffb3f41ffcc02df9ba13fdbf86fe
46f2b2e57afbcb39edb22be693ffc95c8cf107a2ff93efa646c3e480edbf70f59bff4593
fba566fe85b6ff52baed3d9ff281fec14cd8ba9efb82d89d1efc51f336f9bc20febe7cfa
be6df437fe15d796ef8739fec218ed42afd96ccbf96fffb9f67cd99930f9d805b8fb1bf6
a6ff6afb17d9f9ba5de70eef49d9b465d893ff7be59f5090ffa32dfe42b9fe8ef6a911e4
c2a5ce86f20ce960dda34697e067eda5cc5ae892f220c5e088179ed901b7d873fbc466f5
449efddd56fecf3bd852cbfb9b60fda53be5c328caafdd31cbf54bd4ed73d914c9abfb61
dd22d9a4ff6ae51adb61f0be79dd95d884ec9fcf3be09b18e694dd85b0ff40a9e4b97ae5
a5cb96f114ffa43fe310d838e54cfbc25c93edce70d858e034d986e69f48edcb7bd879e2
86cbff23ed4dcf18fec6ed09e5c686f0d207d838edd160f234ff51afd886d815fbb6ff7e
d019ff7afbaf62d8b65ea5edc5ff5af679ffab51e1a4bfd8ee199ae56dbef483f9932bc0
dd07d6ff60a1fb7cf369ff79b8e6a220fa86f463e402cbadf763f205c794f8affe28d3f7
3cff03fb46db8bf462ffcb7afb5fc2e269cbf50ffbce2aff73fa66d87adfc083f287fe9e
c774eeaefe2fa5ff92fa81cba1f15dc7fe8821fba6ff1ff65098e0b6f86af2b23aaffa5c
abe0619af380ff669afe82d894c1fa3ffea9ee79e209d99fe490d903c7ff33f7caff3a86
b8ed94e020cdf30efb277fb6cb38aefa22b4df15edafff79f75394cfed4cd819e19ed907
87f2c75be0b0fe93bcff4996e07cb6fe59cc44a4e57bafc886e17cb5ff0eacd929a3f103
b7ff25f7b677dc5bafed54d902e5adfb24f6b548ddaf07f7b519df55bee543ed08b5fe24
beff0d96e0afd445c69fd1affa883ea4d880df93d97acdfe1bf8c854e0a5c3e627beed05
dd72e0c551bace54f85cfe41f567f14f9fde8d1093d8fa24d046affa61b6d595ddff4df2
ffd97aec67c2ff62d838ecafbff20cb5ff85f8bf48eec0ff42affe952bcb39ea7ed1fc32
c9ed29dd90edc050ff11edb64cf2d872c7fd6cf7d151e4d84fa9d930ffc493fe7fd888fc
c4469ee55bcefd79caed61d6ff83cff46bdc9fc1eb51f379ceadf730ff6bf483fe37dc13
edb9ff05fb55ff1df64393d9a82ffdbf18fb52b2f84dffa7f51a96ff24f389c0df79cb9b
d886d6f360febef44daee46bfec986ed7cfe40c288d793bb09cda5fc44acda86e09920fe
65e277c1e03ea5fe935fd89de00ed0f286dd6bf917afe85da5f67fff09fa93ceb761fecb
9426f7b638e0b17ffeaf79f2cf84e0ad43eb09dd3aedaf62ffd086ff9c17e051befb9340
ec9911ffb927fe7bd888de34e461d9a0ed07df5feb79fe85d76de8c296bbeba0c0ed78ff
d86493f27fc8e179afcf5b92e4c06bd89dfc2fafed1cfa38ffb521afd92fcc9fff81f2a5
0fdb2de058b5f615fa5ae986ff2fd399f703fe4af6d186d892f52599fbd610cefc30f669
ed55beff58eec09fd983fecf3ad872d76bdf2bf5d89a18ffa9ce59f0c419edc12afbb50b
fe5df193bef89cffb831f3b60cdb3ac5f292ffa221e4bd69faacc873e259d517ff9dfb7f
f1b44fc48cbdfba5c74de52bdaaf46ef30cf5aff01d04bafe8c445b9ff0ac1fb26d8fe3b
f2a5e64ccaa5ff7dd885e0c26dfbd072ed7ae00cd93dc1fb8bff93cded66e0a0c329f2af
e179ed6ee4a0c7b75aef31fe50d9c452afe581b6c98fd4affb9f09d99927ff50f10f87fb
b4f23ffeadec8641fad468e683fe9f71ff9661e6c668e89cd119fe4dd25ec979e4c18eef
7cfaab4bd92fedcc79f2d02ddb46fb86f093e0ac43bfd804fc86e4ff42cf1bed9fc0fa5b
fe86c5fb7be486b6f299fa11ff9cee6dacf36aec7db6cc5ffe02f068da13dd4afea20eec
bf3aff97f753fcbc93df64d84df3069effad4bfeda9341c5fb1ab6cb5efb11ff95cca8e4
78f286fe29f44efa1aff2f87d8f479fecf6ce5afc3dda22088e0c35a94ffbf79afed4ad8
04debf41c8fa924bffc079f9a6c2e586f012faa522fe56e08ad0fe78f965b3ff0ca7fe7e
edb0cb38fe62f9c569ff95ccb826afd893f862ff078be09af30eafd921fac635d87adc6f
e020d2e53bd9a0ff10f693c7b686ff80f7aff260bdf7955ae5ad02c6a5d061eb1cf2a5e6
7fd9bf33c6e18652c1fe9661bfff31f07ae5c062ea1ac0ff01e994da72dfaeeda4c1e64f
b7c742aff6933bff4bf4b7ff9e1cf9c506dbf033c1ff93f77cfba5ed0dbfe0a120ed3bda
7b29fda3dc68ecce79d82dea05b6c69fdd3bd892f34bdf9801ffa4bfd90fecaf28e548d9
fe7df253addd7bccf2ad39d8a5ff61f150a2ff89f659cbaefa9652feb72fb1d977e033ed
d227e3c23593d2e545cdff83d8fb62f22dff99fbbe31c4fe71f991f41afb9fed0bf2ade7
83d993d8a63efaa2fb5badd8b53bb8ff8f37cb5bf76eff24fba5e00adabf9ae078d857e8
bb70e5ac67b0fb8812e452d12fe05cb2fc35f5c486ff95f2b1cb38bbff4496f5a4ff6df7
5bf114ffb85ae7afca66f8d260e02a9af284d0f66efa8dc40fb6fed130e9af26ffcd76e1
80d887cbec62df28b8fe3887eacb79dd8fed47fa9eff539ffb5795d8fe098cfbab1df044
afdc8ad8b648c870ff9515df48e562b3cfff78d859d824fc51f720ffb1c96dd288ee44fd
9ff114bffb93e404d887de7aed86fe76f922c5fe01f179cfff4bd7fe24d9b8d8a4ef87d9
81ffcb72d869ddb449e510ff72f885c7afe01ad986cb9fda93d886c7fc8616ffbf25acf1
86fbc25eff52bee0a738eea5e03f98ff78fb86bf52fb19f531feaf13fbbea5e57dd7ff05
bdf718fc62d0bc20cbaff279beff62a1edba65e194c8a4fe35f916ee87e5b443edc0a5ff
95d8f8274fe5afff7bdc9ccb89df60ed06f537ff96de7ad863ccec6ad87bfea5ed53d61d
cb5ed888eda563dcb1fb2ca5f37dbef28448fe35c3ff1af2a423f3abfe02f9ca80d891de
55ed05fb5afe61f238ff1ffb4ff326a5d5ed77e588fe3ad969e6af32dd9909ffd867fc84
f7c916d95ad6ed95b8d29fea6de096d047ff0af455afef935fe2c3a5fe86f182dd0dcde1
18ebc82bfecf35ff6ee67bd083e09afe04f7d979fa59cc0ebd87ddf29333c0f946f408fe
79d096d886e0c50ebff825fea64aff21f2c342b1fa8bff95f232ff51beea93449de3c917
ec419ee1c19bf450afe566d0ec9343beea56acfe61ee25d79dd87addbf93c2e785d077e0
7bccf84d9ffb58b6d894bfff11ccf773fbd379b0ce20eb55bcf188e5a50cf63eff4bb5d8
57f488ed6bdac29edf40d3ff9f4bf303d83ffa5dffaa4ff8b586dd7bb1ed5bd806f15fff
af51c7b86aaed024eb85d9fe5dab02c4ef82b5e96bd2afed31ff4afbb579f2a56ae284db
b879de5f9dffd111dd48e56fd897cdfb16ffc6ed6095fe8bd0fa07ff63d5b979c5fe3d87
ffd87ad093ed1bceaffb69fe30f7b13eff0fb0db3dedafff4293e0c12dc5fe0be951a5ed
81b8e34bbcf350feb579dca14afa32ffc87adfc293fa03fec623aafc9330fa86feb723db
bf93e76de3afca79ed9ad43cff51f913c3f686fbb6dd25d4f57dfbd838feb66cffaf3fc5
fbb1fe65e217c9a5ff55a4d987e4c21ee659ffc346fa07f6cf92ebbf3586ee9fcfaffe08
f7418ede86b60dfbd432dd53b6cb93ed20dafb059adfc115a0fa31ff5ebaf342a0e28ccd
84e5a5d19afa79fea509d8befd04f297e250f37bfad045fe20a1ff9418dd88cafb02ffc3
93d8b64dfba523e574edb079bfe041d0ecb616c86cf67bfb2ac5ff971cfeba26fc6bed82
d0ace59b29dfa54b93fa9f3fea1f9fe586f3cb2fe09ced70e02bd496ff86ee25c0fb14f6
5ba2fe80d92ded9fbee09a3efe15f5aefbc356f22ea4e07cc2f4ac5af2d879aff67bff86
f75bafff9458c0f678fbafe06cdcc29ae482ffc70bf24fff18f153eb2adf4ccaf25b87d9
b16aff78cfaddc1e9de48adac12ec5ed61f83593ed86e21df26cec81d0f35fdbc14fd9ff
6af8af79ff93f2b059e088eda943d5ea59d992c1de04b6f22f89feb970ffbbed63c1e088
c9ff53db0ba4f760fb14ba7af656f23cd861b3e07ecd93dcbf3ef4abcb8afc5286ffc780
d86be0297fff93c1fa4bb3e424d0fe37beff4ec2ea14de3ae6cc73f3aee926d951ed2ef2
af0ffb4bd929a5de94d877dd88fb7cd6aef76398ffcd38ebc424baed3193ffc663fb79f5
a6fe87d97de8d0a85cb8fe9ccf07ff47bbff972efb9f11bbca1ee04dd832e4c207ff50bf
fa7aa5f56efe38affbca69ffd754eeca3cd912b1ff09f24abded7ac6ed84d888ccffd88e
ddbf7bf9c3fe39f24fff27ef88d061ea14d8c5f11fa8e547ff9ad8bbd902e363b9ff85f9
6c9fe5941ded6eb4d881fea50ee032d865ff9ec993ce5eff86c0ed72cbfa62fe35f5aaca
44befd0d93e0c11aaff77efea4f683fbc05aedb404ed52e041d70effbe24d9fe3bc84fe6
a5c0e18715c4e585eeafe562ff6ff69cfa79fea5cb9dd915edca0de0c495f1884ae5bf79
e00797f77efbcc85da93fb9b1cfca745ff23f3aa3b6bfe0e9ee5a50b92d89bd579e0adff
09f8b5ff8136a5d7fb6eefb90afa4ea6fe87f5ce1ad93dc9ef61d9c4a0fa27ffbf4ac1f2
92fe86f1bf4bfd0bf9a5c4e93ba5ffb754e586b6c603ffa0ee67b8ff34f186e060d849d7
15d863ddad37ffd89ed291f86cf2af67fb73bfed86f96efe3797f7affd78d959fe3bf094
dcb90ab6d646ed30f777fe538fffa84ae421d8fe9f16fab4fed45de0a551ec78d863e4cb
81e6d070dd5ac6f8ecafc2fb2affb6f55dfb03f7c5439cdf934997edb6fe883ab2cc65e6
7df2ca53dd329eed93fba812ff87fb56d2af69ed9ffa60d047dd14a9e283d977e01d93fb
d80696f61dd0fe80e078d821c9ea6fd9aafe2cfbb8f36dffa9ed08f4c261b943ff15ade0
c44be5b3f10caed821da83d1ed50dc42ed07d097d884cb2beda7fe87dd80d861e0a4bfde
65ccf884ffa540cff2a44587b0f12ec7fe1af937ffb65dff31b9fa93ee9f1c9352e079d1
63ec36df6ddcb07cfec161fbb9d95edd03bff7da1cffafd32c97eb82c6ff7ad35ae0c04f
dd02e57af2b909db2fe497fa88cbff35f4b6fe57f2b9498bf3d27adbaf3bed5cf98cfeae
43fabf5a9bdd930c9fe0934ec1fe6ee58ff2c697c1fb2f93ff9a39d89ff365ffaff518b6
ff93cca6ff68f31ef95cfe7ada52f21bff94fbc33cf224fb9418d256c2ed9360ddb9e91e
beff619bdec29ed111f3afd98706d847ffcfd9ff32ed95d989cc94ffbf4bed1ce5b12ff1
22ff79f4d8529af1933ffeadf61ffcab43dc08fe79f2b274f79ad82efcc693ff7cd81fec
5293d89928a5d86dffc6e65fbfff4cfb9ecbbc2fde60e387d104f5ce47eeb6fe36d0f97b
b2d52afd1cec5edd70b9ef09cbf978ff31de9543c1e562c80efb52bfe086d890dd97d036
e5afcf5bea0d86ffabd778edaff59dfb09b8fa27ff5bf77acfaff28947f070e99752f1c2
fe79e4a96301b6c95afa14fe51f1109ffa91d886ffcf78e0a4cc438affc976ddbe6ae079
d867cdf971f1a5d92efecfa846ffaf79e657c3f167ffa5c3ef79fbb8ed01e59824b3fb14
aee56cf10affa7c3f313ffa3ed7ab3ff70d881deaf18eb44e399cab679f634fecf7fe0a8
51d290e57acbfb5aa3fb80f279e79c34fb4dff03f272ffa264fb93c9afdd9960eebc4bd8
37e062d0eb81d992d896dd36e60cffbfabfe42c0fb933db6f428bffbef83fda7bfdf86d8
80e5d030e466f3509efbc20efbade9bc12fd5af9cb0dffb0ed159fe0b74cb6ec9321e8be
65edc138fba00ce0af40fd06e05ad97ffe86d1f179cf9edd2dd888d96bed4294d8b63bb9
fb1ec3e627f260ff95beff86f84affd887e4a520fa57fec3ef27b0fe05abedd626e09fd1
21f4c3aded9fc5a7d612edc228f150fe2bf9c102ff87fec57dff9951fd68f410fe6afb86
d879dd21cba5e028d0ed7ccd9dea8851d823e445a4f426ffb878fea5cb0bbfec3c8ee57b
f22883e2a5ed3095e9c13d93febf27ff8cf86bc8ff7af9d011feb66eddb87af6c095d2af
ff37cd4ddf38bef93efe5cf693ff57f798bfff78f993da6ae09f57fbaecd3ded52cf0eaf
de9302fb49c0d993dd89119efbd85bd0f83892feaf41ffb560fe0fce59f73bfdb66de09b
bed88de555e895cfb510adf227e5c01ccbace54dc9a8ee5af993fe7af781ffb013fa4cfe
38ddff9cf27affc770e0af3aedc354ffa9f75cd1ffb74db3d8fec14ad1afff8760fbd85d
e284c4e516dd52b3d83fabe082cbf54fffce20dd5ff96b9ff286f79bff64ace486ed74c9
19b8ce22e14dd428ef51ff86f7be8e01e5a1c2fc6bf3d875f1afcc9aff78f33ab8ecbe4a
87ea9d67bce06ac7eb7ddabf93e580de89d97acaf945ff08f338b9d384f53efadc6ad8b5
78fea5ef72c5a3ec01b9cd2de051d904db4de1a0d893c7b67b
    >
  >>

>>
dup /HalftoneName 3 index put
/Halftone defineresource
pop
0` f  R n/./.N-@/./N( O LN^NuNVH&n (n /<   0+ HH@B@/ N-@B-l 8-l <x z BFHSPg.Jg/,N0H/  L(/NJPg/,N , &Ѭ J l
 H ` H m H  , *Ѭ J l
 H ` H m H  , .Ѭ "J "l
 H "` H "m H "/, 8/.N4Ѭ 
/, </.N$Ѭ =k p
nO o=| 
0. ()@ 2rdN)@ 2p 2op)@ 2 l PCT"" , H@Hl                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %!PS
%    Copyright (C) 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.
%
% $Id: image-qa.ps,v 1.3.2.1 2002/02/22 19:45:55 ray Exp $
% Tests for the image operators

% Specifications for Image operator testing.
% 
% 1.  All 8 standard orientations (0, 90, 180, 270 degree rotations with
%     and without reflection); ditto those orientations perturbed by +/-
%     10 degrees, and by 45 degrees.
%
%     Enough space is provided around images on a test page to allow
%     these permutations to use the same page layout. This will make
%     test page construction easier and simplify page checking.
% 
% 2.  All 9 image types (ImageType 1 mask, ImageType 1 opaque,
%     ImageType 3 with all 3 InterleaveTypes and with unequal scaling
%     for InterleaveType 2 and 3, ImageType 4 with both range and
%     single-point matching).
% 
% 3.  DeviceGray, DeviceRGB, and DeviceN color, both direct and Indexed.
%     Indexed color will use the common pallete size of 256 colors.
% 
% 4.  For simple masks, both colored and uncolored Patterns.
% 
% 5.  CombineWithColor true and false; several different colors for the
%     true case (including black, white, other solid colors, halftones,
%     and patterns).
% 
% 6.  Source transparency true and false.
% 
% 7.  Texture transparency true and false.
% 
% 8.  Different RasterOp values.
% 
% 9.  For ImageType 4, different color keys (out-of-range, specific
%     color other than white, range without white).
% 
% 10. String, file, and procedure data sources; for multi-component
%     color spaces, MultipleDataSources = true. This is tested by
%     constructing string data sources that are used as input to
%     SubFileDecode filter to create a filetype data source. These
%     filters are read into scratch strings for the procedure data 
%     source case. The procedure data source scratch string length
%     does not match the raster width, and the width x height is
%     not an integer multiple of the string length.
%
%     Also for the File case, the number of bytes consumed is
%     checked after the image operator to verify that the exact
%     amount of data is used. This is particularly important when
%     the currentfile is used as a source (possibly through a
%     filter.
%
%     Image bytes per line are < 500 bytes to exercise direct and
%     buffer copy gs_image_next_planes mode with the default stream
%     buffer size of 512 bytes. Procedure string size is greater
%     than the image bytes per line for the same reason (sM and sD).
%
%     Total string size is kept below 65535.

/WidthRGB	83 def
/HeightRGB	89 def

% 
% 11. Banded and non-banded rendering. This can be tested by running
%     test files throuch with different page device parameters to
%     force banding vs. page mode.
%
% -------------------------------------------------------------------------
%
% Testing the RasterOp-related functions (5/6/7/8) is not necessary at this
% time.  They are well isolated logically.
% 
% Testing orientation (1) and color masking (9) would be a good idea at some
% point, because this code has broken many times in the past and has had a
% long bug tail.
% 
% The really important things to test are 2 (image type), 3/4 (color space --
% but only with regard to number of components, plus DeviceN and simple masks
% with a Pattern, which exercise special control paths), 10 (data source),
% and 11 (banding modes).
% 
% ==========================================================================

%
% Procedure to generate test mask data
%
% WM and HM must be defined prior to invocation
%     MaskGen -	
%
% The mask data is stored into a string named /MaskData
%
% The mask consists of a "target". Bits past width WM are
% filled with 1's to make sure that pad bits are ignored.
%
/MaskGen {
  /H8 HM 8 div def
  /X0 WM 2 div def
  /Y0 HM 2 div def
  /WB WM 7 add 8 div cvi def
  /MaskData WB HM mul string def
  /MB [ 128 64 32 16 8 4 2 1 ] def
  0 1 HM 1 sub {
    /Y exch def
    0 1 WB 1 sub {
      /B exch def	% byte within the row
      /C B Y WB mul add def 
      /P 0 def
      0 1 7 {
	/b exch def	% bit within the character
        /X b B 8 mul add def 
	X WM lt
	  { X Y eq
	    X HM 1 sub Y sub eq or
	    Y Y0 gt X X0 sub abs 2 le and or
	    X X0 sub WM div dup mul Y Y0 sub HM div dup mul add sqrt 9 mul cvi 2 mod 1 eq or
	  }
	  { true }	% pad bits are always set
	ifelse
	% stack: true if pixel is set
	{ 
	  MB b get P or /P exch def
	} if
      } for % Bits within a byte
      MaskData C P put
    } for % Bytes within the row
  } for % Rows in the mask
} bind def			% MaskGen

%
% WM and HM must be defined prior to invocation
%     BPC MaskGenBPC -	
%
% The mask data is stored into a string named /MaskData
%
% The mask consists of a "target". BPC is the size of the elements
% in the MaskData string (must be 4, 8 or 12)
%
/MaskGenBPC {
  /BPC exch def
  /X0 WM 2 div def
  /Y0 HM 2 div def
  /WB WM BPC mul 7 add 8 div cvi def		% Width in Bytes
  /MaskData WB HM mul string def
  0 1 HM 1 sub {
    /Y exch def
    0 1 WM 1 sub {
      /X exch def
      MaskData				% Target string
      X Y eq
      X HM 1 sub Y sub eq or
      Y Y0 gt X X0 sub abs 2 le and or
      X X0 sub WM div dup mul Y Y0 sub HM div dup mul add sqrt 9 mul cvi 2 mod 1 eq or
      X BPC mul 8 div Y WB mul add exch
      [
        { }						% BPC = 0
	{ { 1 } { 0 } ifelse put4bit }			% BPC = 4
	{ { 255 } { 0 } ifelse exch cvi exch put }	% BPC = 8
	{ { 1 } { 0 } ifelse put12bit }			% BPC = 12
      ] BPC 4 div cvi get exec
    } for
  } for % Rows in the mask
} bind def

% -----------------------------------------------------------------------

% Procedure to generate image data
%
% WD and HD must be defined prior to invocation
%    { proc } ImageGen -
%
% The procedure is called once for each pixel
% Local definitions are R, G, B, X and Y

% Example: Generate RGB Chunky pixel data (single data source) BPC = 8
%       /WD WidthRGB def
%       /HD HeightRGB def
%       /RGBData WD HD mul 3 mul string def
% 	{ X Y WD mul add 3 mul RGBData
% 	  dup 2 index R 255 mul cvi put
% 	  dup 2 index 1 add G 255 mul cvi put
% 	  exch 2 add B 255 mul cvi put
% 	} ImageGen

/ImageGen {
  gsave
  0 1 HD 1 sub {
    /Y exch def
    0 1 WD 1 sub {
      /X exch def
      /D X WD 2 div sub WD div dup mul Y HD 2 div sub HD div dup mul add sqrt def
      /D D .6 div def
      /A X WD 2 div sub Y HD 2 div sub atan 360 div def
      A                               % Hue
      .7 D .3 sub .60 div sub  % Saturation
      dup 0.05 lt
        { .95 D .8 sub 3 mul sub 3 mul cvi 3 div sqrt } % Level once Saturation < 0
        { .7 D .25 sub .75 div add }  % Level inside
      ifelse
      X WD 2 div gt Y HD 2 div sub abs 2 le and { pop 0 } if   % asymmetric marker
      sethsbcolor
      currentrgbcolor /B exch def /G exch def /R exch def
      dup exec
    } for
  } for
  pop		% discard the procedure
  grestore
} bind def


% -----------------------------------------------------------------------
%
% Procedures for ImageMatrix creation
/IMLRTB { [ WD 0 0 HD neg 0 HD ] } def
/IMLRBT { [ WD 0 0 HD 0 0 ] } def
/IMRLTB { [ WD neg 0 0 HD neg WD HD ] } def
/IMRLBT { [ WD neg 0 0 HD WD 0 ] } def
% -----------------------------------------------------------------------
%
% Procedure to make invocation of image operators more concise
%
% YY, SX, SY, WD and HD should be defined prior to invocation
% X matrix source decode DoImageMask -
%
/DoImageMask {
  gsave
  /D exch def
  /S exch def
  /M exch def
  /XX 1 index def
  YY translate SX SY scale
  0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
  .5 .5 translate
  IR rotate
  -.5 -.5 translate
  <<
  /ImageType		1
  /Width		WM
  /Height		HM
  /ImageMatrix		M
  /MultipleDataSources	false
  /DataSource		S
  /Decode		D
  /BitsPerComponent	1
  >>
  imagemask
  grestore
} bind def

% YY, SX, SY, WD and HD should be defined prior to invocation
% X Y BPC matrix source multi decode DoImage1 -
%
/DoImage1 {
  gsave
  CSpace setcolorspace
  /D exch def
  /MS exch def
  /S exch def		% May be an array of sources
  /M exch def
  /BPC exch def
  /XX 1 index def
  YY translate SX SY scale
  0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
  .5 .5 translate
  IR rotate
  -.5 -.5 translate
  <<
  /ImageType		1
  /Width		WD
  /Height		HD
  /ImageMatrix		M
  /MultipleDataSources	MS
  /DataSource		S
  /BitsPerComponent	BPC
  /Decode		D
  >>
  image
  grestore
} bind def


% YY, SX, SY, WD and HD should be defined prior to invocation
% X Y BPC matrix source multi decode MaskColor DoImage4 -
%
/DoImage4 {
  gsave
  CSpace setcolorspace
  /MC exch def
  /D exch def
  /MS exch def
  /S exch def		% May be an array of sources
  /M exch def
  /BPC exch def
  /XX 1 index def
  YY translate SX SY scale
  0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
  .5 .5 translate
  IR rotate
  -.5 -.5 translate
  <<
  /ImageType		4
  /Width		WD
  /Height		HD
  /ImageMatrix		M
  /MultipleDataSources	MS
  /DataSource		S
  /BitsPerComponent	BPC
  /Decode		D
  /MaskColor		MC
  >>
  image
  grestore
} bind def

% YY, SX, SY, W, HD (Data) WM, HM (Mask) should be defined prior to invocation
%                                                   (IT is InterleaveType)
% X Y BPC matrix source multi MaskDecode DataDecode IT DoImage3 -
%
/DoImage3 {
  gsave
  CSpace setcolorspace
  /IT exch def
  /DD exch def
  /DM exch def
  /MS exch def
  /S exch def		% May be an array of sources - For InterleaveType 3
  			% S[0] is the Mask DataSource
  /M exch def
  /BPC exch def
  /XX 1 index def
  YY translate SX SY scale
  0 setlinewidth 0 0 moveto 1 0 lineto 1 1 lineto 0 1 lineto 0 0 lineto stroke
  .5 .5 translate
  IR rotate
  -.5 -.5 translate
  /DataImage
  <<
  /ImageType		1
  /Width		WD
  /Height		HD
  /ImageMatrix		M
  /MultipleDataSources	MS
  /DataSource		IT 3 ne { S } { S 1 get exec } ifelse
  /BitsPerComponent	BPC
  /Decode		DD
  >>
  def
  /MaskImage
  <<
  /ImageType		1
  /Width		WM
  /Height		HM
  /ImageMatrix		% construct the mask matrix using signs from the DataImage matrix
			/M0 M 0 get WD abs div cvi def
			/M3 M 3 get HD abs div cvi def
			/M4 M 4 get WD abs div cvi def
			/M5 M 5 get HD abs div cvi def
			[ WM M0 mul 0 0 HM M3 mul WM M4 mul HM M5 mul ]
  IT 3 eq {
    /DataSource		S 0 get exec	% DataSource only allowed for InterleaveType 3
  } if
  /BitsPerComponent	IT 1 eq { BPC } { 1 } ifelse
  /Decode		DM
  >>
  def
  <<
  /ImageType		3
  /DataDict		DataImage
  /MaskDict		MaskImage
  /InterleaveType	IT
  >>
  image
  grestore
} bind def


% -----------------------------------------------------------------------
%
/Helvetica-Bold findfont 20 scalefont /TitleFont exch def

/FontSize 10 def
/Helvetica-Narrow findfont FontSize scalefont /LegendFont exch def

/blockshow {	% like "show" but '\n' causes new-line
  dup = flush	%DEBUG
  currentpoint /showY exch def /showX exch def
  {
    dup 10 ne
    { 1 string dup 0 4 -1 roll put show }
    { pop showX showY FontSize sub dup /showY exch def moveto }
    ifelse
  } forall
} bind def

/TX 013 def	% Title left X
/SX 036 def
/XA 060 def
/XB XA SX 1.5 mul add def
/XC XA SX 3.0 mul add def
/XD XA SX 4.5 mul add def
/XE XA SX 6.0 mul add def
/XF XA SX 7.5 mul add def
/XG XA SX 9.0 mul add def
/XH XA SX 10.5 mul add def
/XI XA SX 12.0 mul add def
/XJ XA SX 13.5 mul add def

/BY 036 def	% Bottom Title Top line
/SY 037 def
/YA 050 def
/YB YA SY 1.8 mul add def
/YC YA SY 3.6 mul add def
/YD YA SY 5.4 mul add def
/YE YA SY 7.2 mul add def
/YF YA SY 9.0 mul add def
/YG YA SY 10.8 mul add def
/YH YA SY 12.6 mul add def
/YI YA SY 14.4 mul add def
/YJ YA SY 16.2 mul add def
/YK YA SY 18.0 mul add def

% -----------------------------------------------------------------------
%
%     Utility procedures to support storing 4 and 12 bit elements in
%     strings.
%
%     <string> <index> <value> put##bit -
%
%     <index> will have a fractional part ( .5 ) if the element
%     starts on a 4-bit boundary.
%
%     <value> is between 0 and 1 and is scaled 0 to 15 (4bit) or
%     0 to 4095 (12 bit)

/put4bit {
  15 mul cvi 
  exch dup cvi dup 3 1 roll eq 3 -1 roll exch
  { % integer index means high nibble.
    16 mul put
  }
  { % low nibble -- combine with high nibble
    2 index 2 index get or put
  }
  ifelse
} bind def

/put12bit {
  1 index cvi /I exch def
  2 index /S exch def
  4095 mul cvi 
  exch dup dup cvi eq
  { % integer index means high byte is aligned
    cvi exch 3 copy 16 div cvi put
    exch 1 add exch 15 and 16 mul put
  }
  { % low nibble -- combine with high nibble
    cvi exch 3 copy 2 index 2 index get exch 256 div cvi or put
    255 and exch 1 add exch put
  }
  ifelse
} bind def

% -----------------------------------------------------------------------
%
%     Procedures to use generated string data as procedure or files

/WD WidthRGB def
/HD HeightRGB def

/sM WidthRGB 2 mul 1 sub string def	% long enough to hold more than one mask line
/sD WidthRGB 7 mul 1 sub string def	% long enough to hold more than one 12 bit RGB line
				% worst case is 12bit ImageType3 InterleaveType 1 == 48 bits

/MaskDProc {
  /FM MaskData dup length () /SubFileDecode filter def
  { { FM sM readstring pop } }
} bind def

/FileTailString (12345) def		% Marker string to check file data usage

/AppendFileTail {    %  <string> AppendFileTail <string_with_tail> <original_length>
  dup length FileTailString length add string
  dup 0 3 index putinterval
  dup 2 index length FileTailString putinterval
  exch length
} bind def

/MaskDFile {
  MaskData dup length () /SubFileDecode filter 
  /MDF 1 index def
} bind def

/RGBDProc {
  /FD RGBData dup length () /SubFileDecode filter def
  { { FD sD readstring pop } }
} bind def

/RGBDFile {
  RGBData dup length () /SubFileDecode filter 
  /RGBDF 1 index def
} bind def

/sR WidthRGB 2 mul 1 sub string def	% long enough to hold more than one line of 12 bit data
/sG WidthRGB 2 mul 1 sub string def
/sB WidthRGB 2 mul 1 sub string def

/RDProc {
  /FR RData dup length () /SubFileDecode filter def
  { FR sR readstring pop }
} bind def

/GDProc {
  /FG GData dup length () /SubFileDecode filter def
  { FG sG readstring pop }
} bind def

/BDProc {
  /FB BData dup length () /SubFileDecode filter def
  { FB sB readstring pop }
} bind def

/RDFile {
  RData dup length () /SubFileDecode filter 
  /RDF 1 index def
} bind def

/GDFile {
  GData dup length () /SubFileDecode filter 
  /GDF 1 index def
} bind def

/BDFile {
  BData dup length () /SubFileDecode filter 
  /BDF 1 index def
} bind def

% -----------------------------------------------------------------------
% 
%  Procedure to handle fileposition. Ghostscript has a private
%  operator .fileposition that works when fileposition does not
% 
%    <file> tryfilepos
% 	Returns:	fileposition true	if successful
%			0 false			if not
/tryfilepos {	
  /.fileposition where
    { pop /.fileposition load }	% most likely to succeed
    { /fileposition load }
  ifelse
  stopped
    { pop 0 false }
    { true }
  ifelse
} bind def

% -----------------------------------------------------------------------
% 
% Procedure to provide =only operator if not present. Suggested
% by Alex Cherepanov to use =print operator present on some Adobe
% implementations.
/=only where
  { pop }
  { /=print where { pop /=print load } { /print load } ifelse
    /=only exch def
  }
ifelse

% -----------------------------------------------------------------------
% 
%  Procedure to make sure that the file is at the EOF.
%  added above (string == FileTailString.
%
%  If not, it will mark the image area with a red "F"
% 
%    <string> <title> <file> CheckFileTail -	XX is the horizontal position
%						YY is the vertical position
%						SX,SY determine size of "F" if fail
/CheckFileTail {
  dup
  status not dup	% status false says no longer valid
  { (Unexpected EOF: XX,YY=) print XX =only (,) print YY = false }
  { 1 index tryfilepos not exch 5 index length ne or dup
    { 3 index print ( fileposition = ) print
      2 index tryfilepos pop =only
      ( doesn't match expected = ) print 4 index length = flush
    }
    if
  }
  ifelse
  or
  {
    gsave .8 0 0 setrgbcolor
    SX 4 div setlinewidth
    XX YY moveto 0 SY rlineto SX 0 rlineto stroke
    XX YY SY .5 mul add moveto SX .5 mul 0 rlineto stroke
    grestore
  }
  if
  pop pop pop
} bind def

/CSpaceName {		%    - CSpaceName <string>
  CSpace dup type /arraytype eq { 0 get } if
  15 string cvs
} bind def
% -----------------------------------------------------------------------
%
% tests

/CheckImage {

  /IR 0 def
  /CSpace /DeviceRGB def

  % Use an unusual (unpleasant?) underlying color
  .6 .95 .4 setrgbcolor clippath fill

  0 0 0 setrgbcolor
  TitleFont setfont
  200 760 moveto (Image Type 3 Tests) show
  200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
  170 720 moveto (Colorspace = ) show CSpaceName show
  LegendFont setfont
  
  .4 .1 .7 setrgbcolor	% contrasting color for stencil masking
  /SX SX 2 mul def /SY SY 2 mul def
  /YY 780 SY sub def 
  MaskGen
  TX IMLRTB MaskData  [1 0] DoImageMask

  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XI  8  IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
  /SX SX 2 div def /SY SY 2 div def

  showpage
} def

% -----------------------------------------------------------------------
%
% Type 1 and Type 4 Tests

%	/CSpace and /IR are defined in order to generate various pages
/T1T4Tests {	% 
  
  % Use an unusual (unpleasant?) underlying color
  .6 .95 .4 setrgbcolor clippath fill
  0 0 0 setrgbcolor

  TitleFont setfont
  120 760 moveto (Image Type 1 and ImageType 4 Tests) show
  200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
  170 720 moveto (Colorspace = ) show CSpaceName show
  LegendFont setfont

  XA BY moveto (Decode\nInverted) blockshow
  XB BY moveto (  IMLRTB\nDS=string) blockshow
  XC BY moveto (  IMLRBT\nDS=string) blockshow
  XD BY moveto (  IMRLTB\nDS=string) blockshow
  XE BY moveto (  IMRLBT\nDS=string) blockshow
  XF BY moveto (IMLRTB\nDS=proc) blockshow
  XG BY moveto (IMLRTB\nDS=file) blockshow
  XH BY moveto (   Multi\nDS=string) blockshow
  XI BY moveto (  Multi\nDS=proc) blockshow
  XJ BY moveto (  Multi\nDS=file) blockshow
  
  .4 .1 .7 setrgbcolor	% contrasting color for stencil masking
  
  /WM WD def
  /HM HD def
  /SX SX 2 mul def /SY SY 2 mul def
  /YY 780 SY sub def 
  MaskGen
  TX IMLRTB MaskData  [1 0] DoImageMask

  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XI  8  IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
  /SX SX 2 div def /SY SY 2 div def
  
  % ----------------------------------------------------------------------
  % 			Type 1 Stencil Mask Images
  
  /YY YA def
  TX YA SY add moveto (\nType 1\nStencil\nMask) blockshow
  
  MaskGen

  % X matrix source   decode 
   XA IMLRTB MaskData  [0 1] DoImageMask
   XB IMLRTB MaskData  [1 0] DoImageMask
   XC IMLRBT MaskData  [1 0] DoImageMask
   XD IMRLTB MaskData  [1 0] DoImageMask
   XE IMRLBT MaskData  [1 0] DoImageMask
   XF IMLRTB MaskDProc [1 0] DoImageMask
   XG IMLRTB MaskDFile [1 0] DoImageMask
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Single Data Sources, BPC==8
  
  /YY YB def
  TX YY SY add moveto (\nType 1\nRGB\nBPC=8) blockshow
  
  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XA  8  IMLRTB RGBData false  [1 0 1 0 1 0]  DoImage1
   XB  8  IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XC  8  IMLRBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XD  8  IMRLTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XE  8  IMRLBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XF  8  IMLRTB RGBDProc false [0 1 0 1 0 1]  DoImage1
   XG  8  IMLRTB RGBDFile false [0 1 0 1 0 1]  DoImage1
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Multiple Data Sources, BPC==8
  
  WD HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { X Y WD mul add 
    RData 1 index R 255 mul cvi put
    GData 1 index G 255 mul cvi put
    BData exch    B 255 mul cvi put
  } ImageGen

  
  % X BPC matrix source                   multi decode         
   XH  8  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1]  DoImage1
   XI  8  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1]  DoImage1
   XJ  8  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1]  DoImage1
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==8, mask black
  
  /YY YE def
  TX YY SY add moveto (\nType 4\nBPC=8\nmask=black) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor        
   XA  8  IMLRTB RGBData false  [1 0 1 0 1 0] [ 000 000 000 ]  DoImage4
   XB  8  IMLRTB RGBData false  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XC  8  IMLRBT RGBData false  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XD  8  IMRLTB RGBData false  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XE  8  IMRLBT RGBData false  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XF  8  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XG  8  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==8, mask black
  
  % X BPC matrix source                   multi decode         MaskColor       
   XH  8  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XI  8  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   XJ  8  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 000 000 000 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==8, mask white
  
  /YY YF def
  TX YY SY add moveto (\nType 4\nBPC=8\nmask=white) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor        
   XA  8  IMLRTB RGBData false  [1 0 1 0 1 0] [ 255 255 255 ]  DoImage4
   gsave .5 .2 .2 setrgbcolor XB YY SX 13 mul SY rectfill grestore
   XB  8  IMLRTB RGBData false  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XC  8  IMLRBT RGBData false  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XD  8  IMRLTB RGBData false  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XE  8  IMRLBT RGBData false  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XF  8  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XG  8  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==8, mask white
  
  % X BPC matrix source                   multi decode         MaskColor       
   XH  8  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XI  8  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   XJ  8  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 255 255 255 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==8, mask gray
  
  /YY YG def
  TX YY SY add moveto (\nType 4\nBPC=8\nmask=gray) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor        
   XA  8  IMLRTB RGBData false  [1 0 1 0 1 0] [ 147 147 147 ]  DoImage4
   XB  8  IMLRTB RGBData false  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XC  8  IMLRBT RGBData false  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XD  8  IMRLTB RGBData false  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XE  8  IMRLBT RGBData false  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XF  8  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XG  8  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==8, mask gray
  
  % X BPC matrix source                   multi decode         MaskColor       
   XH  8  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XI  8  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   XJ  8  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 147 147 147 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==8, mask range
  
  /YY YH def
  TX YY SY add moveto (\nType 4\nBPC=8\nmask range) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor                  
   XA  8  IMLRTB RGBData false  [1 0 1 0 1 0] [ 020 200 020 200 020 200 ]  DoImage4
   XB  8  IMLRTB RGBData false  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XC  8  IMLRBT RGBData false  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XD  8  IMRLTB RGBData false  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XE  8  IMRLBT RGBData false  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XF  8  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XG  8  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==8, mask range
  
  % X  Y SX SY BPC matrix source                   multi decode         MaskColor                  
   XH  8  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XI  8  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   XJ  8  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 020 200 020 200 020 200 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Single Data Sources, BPC==12
  
  /YY YC def
  TX YY SY add moveto (\nType 1\nRGB\nBPC=12) blockshow
  
  /RGBData WD 36 mul 7 add 8 div cvi HD mul string def
  { 
    X 36 mul 8 div Y WD 36 mul 7 add 8 div cvi mul add
    RGBData 1 index R put12bit
    RGBData 1 index 1.5 add G put12bit
    RGBData exch 3 add B put12bit
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XA  12 IMLRTB RGBData false  [1 0 1 0 1 0]  DoImage1
   XB  12 IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XC  12 IMLRBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XD  12 IMRLTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XE  12 IMRLBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XF  12 IMLRTB RGBDProc false [0 1 0 1 0 1]  DoImage1
   XG  12 IMLRTB RGBDFile false [0 1 0 1 0 1]  DoImage1
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Multiple Data Sources, BPC==12
  
  WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
    RData 1 index R put12bit
    GData 1 index G put12bit
    BData exch B put12bit
  } ImageGen
  
  % X BPC matrix source                   multi decode         
   XH  12 IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1]  DoImage1
   XI  12 IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1]  DoImage1
   XJ  12 IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1]  DoImage1
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==12, mask range
  
  /YY YI def
  TX YY SY add moveto (\nType 4\nBPC=12\nmask range) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor                  
   XA 12  IMLRTB RGBData false  [1 0 1 0 1 0] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XB 12  IMLRTB RGBData false  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XC 12  IMLRBT RGBData false  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XD 12  IMRLTB RGBData false  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XE 12  IMRLBT RGBData false  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XF 12  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XG 12  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==12, mask range
  
  % X BPC matrix source                   multi decode         MaskColor                  
   XH 12  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XI 12  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   XJ 12  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 300 3000 300 3000 300 3000 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Single Data Sources, BPC==4
  
  /YY YD def
  TX YY SY add moveto (\nType 1\nRGB\nBPC=4) blockshow
  
  /RGBData WD 12 mul 7 add 8 div cvi HD mul string def
  { 
    X 12 mul 8 div Y WD 12 mul 7 add 8 div cvi mul add
    RGBData 1 index         R put4bit
    RGBData 1 index 0.5 add G put4bit
    RGBData exch    1.0 add B put4bit
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XA  4  IMLRTB RGBData false  [1 0 1 0 1 0]  DoImage1
   XB  4  IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XC  4  IMLRBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XD  4  IMRLTB RGBData false  [0 1 0 1 0 1]  DoImage1
   XE  4  IMRLBT RGBData false  [0 1 0 1 0 1]  DoImage1
   XF  4  IMLRTB RGBDProc false [0 1 0 1 0 1]  DoImage1
   XG  4  IMLRTB RGBDFile false [0 1 0 1 0 1]  DoImage1
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 1 RGB Multiple Data Sources, BPC==4
  
  WD 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 2 div Y WD 1 add 2 div cvi mul add
    RData 1 index R put4bit
    GData 1 index G put4bit
    BData exch    B put4bit
  } ImageGen
  
  % X BPC matrix source                   multi decode         
   XH  4  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1]  DoImage1
   XI  4  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1]  DoImage1
   XJ  4  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1]  DoImage1
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Single Data Sources, BPC==4, mask range
  
  /YY YJ def
  TX YY SY add moveto (\nType 4\nBPC=4\nmask range) blockshow
  
  % X BPC matrix source  multi  decode        MaskColor           
   XA  4  IMLRTB RGBData false  [1 0 1 0 1 0] [ 1 10 1 10 1 10 ]  DoImage4
   XB  4  IMLRTB RGBData false  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XC  4  IMLRBT RGBData false  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XD  4  IMRLTB RGBData false  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XE  4  IMRLBT RGBData false  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XF  4  IMLRTB RGBDProc false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XG  4  IMLRTB RGBDFile false [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
  % ----------------------------------------------------------------------
  % 			Type 4 RGB Multiple Data Sources, BPC==4, mask range
  
  % X BPC matrix source                   multi decode         MaskColor          
   XH  4  IMLRTB [ RData GData BData ]    true  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XI  4  IMLRTB [ RDProc GDProc BDProc ] true  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   XJ  4  IMLRTB [ RDFile GDFile BDFile ] true  [0 1 0 1 0 1] [ 1 10 1 10 1 10 ]  DoImage4
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  showpage
  
} bind def 	% T1T4Tests

% -----------------------------------------------------------------------
%
% Type 3 Tests

/T3Tests {
  % Use an unusual (unpleasant?) underlying color
  .6 .95 .4 setrgbcolor clippath fill

  0 0 0 setrgbcolor
  TitleFont setfont
  200 760 moveto (Image Type 3 Tests) show
  200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
  170 720 moveto (Colorspace = ) show CSpaceName show
  LegendFont setfont
  
  .4 .1 .7 setrgbcolor	% contrasting color for stencil masking

  /WM WD def
  /HM HD def
  /SX SX 2 mul def /SY SY 2 mul def
  /YY 780 SY sub def 
  MaskGen
  XA IMLRTB MaskData  [1 0] DoImageMask

  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source  multi  decode         
   XH  8  IMLRTB RGBData false  [0 1 0 1 0 1]  DoImage1
  /SX SX 2 div def /SY SY 2 div def
  
% ----------------------------------------------------------------------
% 		InterleaveType 1, BPC==8, WM=WD, HM=HD
%		IT 1 is what GS calls "chunky pixel"
  /YY YA def
  TX YY SY add moveto (\nIntType 1\nBPC=8) blockshow
  
  % Generate the MaskData first
  8 MaskGenBPC

  % Generate the Data Image (uses the MaskData)
  /RGBData WD HD mul 4 mul string def
  { X Y WD mul add 4 mul		% 4 bytes Mask,Red,Green,Blue
    RGBData
    dup 2 index       MaskData X Y WB mul add get put
    dup 2 index 1 add R 255 mul cvi put
    dup 2 index 2 add G 255 mul cvi put
    exch        3 add B 255 mul cvi put
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  1 DoImage3
   XB  8  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  1 DoImage3
   XC  8  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  1 DoImage3
   XD  8  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XE  8  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XF  8  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XG  8  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XH  8  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XI  8  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 1, BPC==12, WM=WD, HM=HD
%		IT 1 is what GS calls "chunky pixel"
  /YY YB def
  TX YY SY add moveto (\nIntType 1\nBPC=12) blockshow
  
  % Generate the MaskData first
  12 MaskGenBPC

  % Generate the Data Image (uses the MaskData)
  /RGBData WD HD mul 6 mul string def
  { X Y WD mul add 6 mul		% 6 bytes Mask,Red,Green,Blue
    RGBData
    dup 2 index       
    		      MaskData X 1.5 mul .5 add cvi
		      Y WB mul add get	% get the aligned mask byte (hi or lo)
    		      0 eq { 0 } { 1 } ifelse
    		      put12bit
    dup 2 index 1.5 add R put12bit
    dup 2 index 3.0 add G put12bit
    exch        4.5 add B put12bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  1 DoImage3
   XB 12  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  1 DoImage3
   XC 12  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  1 DoImage3
   XD 12  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XE 12  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XF 12  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XG 12  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XH 12  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XI 12  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 1, BPC==4, WM=WD, HM=HD
%		IT 1 is what GS calls "chunky pixel"
  /YY YC def
  TX YY SY add moveto (\nIntType 1\nBPC=4) blockshow
  
  % Generate the MaskData first
  4 MaskGenBPC

  % Generate the Data Image (uses the MaskData)
  /RGBData WD HD mul 2 mul string def
  { X Y WD mul add 2 mul		% 2 bytes Mask,Red,Green,Blue
    RGBData
    dup 2 index       MaskData X 2 div cvi Y WB mul add get
    		      X 1 and 0 eq { 128 div cvi } { 1 and } ifelse
		      put4bit
    dup 2 index 0.5 add R put4bit
    dup 2 index 1.0 add G put4bit
    exch        1.5 add B put4bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  1 DoImage3
   XB  4  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  1 DoImage3
   XC  4  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  1 DoImage3
   XD  4  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XE  4  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XF  4  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XG  4  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XH  4  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   XI  4  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  1 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==8, WM=WD, HM=HD
%		IT 2 is line interleave -- Mask line follwoed by Data line
%		RGB Image Data must be chunky (MultipleDatasources==false).
  /YY YD def
  TX YY SY add moveto (\nIntType 2\nBPC=8) blockshow
  
  % Generate the MaskData first
  MaskGen

  % Generate the Data Image (uses the MaskData)
  /BPL WD 3 mul WB add cvi def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 3 mul Y BPL mul add WB add  		% 3 bytes Red,Green,Blue + Mask Bytes
    X 0 eq {
      RGBData 1 index WB sub
      MaskData Y WB mul WB getinterval
      putinterval
    } if
    RGBData
    dup 2 index        R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch        2 add B 255 mul cvi put
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB  8  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC  8  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD  8  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE  8  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF  8  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG  8  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH  8  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI  8  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==12, WM=WD, HM=HD
  /YY YE def
  TX YY SY add moveto (\nIntType 2\nBPC=12) blockshow
  
  % Generate the Data Image (uses the MaskData)
  /BPL WD 36 mul 7 add 8 div cvi WB add def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 36 mul 8 div Y BPL mul add WB add
    X 0 eq {
      RGBData 1 index WB sub cvi
      MaskData Y WB mul WB getinterval
      putinterval
    } if
    RGBData
    dup 2 index         R put12bit
    dup 2 index 1.5 add G put12bit
    exch        3.0 add B put12bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB 12  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC 12  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD 12  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE 12  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF 12  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG 12  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH 12  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI 12  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==4, WM=WD, HM=HD
  /YY YF def
  TX YY SY add moveto (\nIntType 2\nBPC=4) blockshow
  
  % Generate the Data Image (uses the MaskData)
  /BPL WD 12 mul 7 add 8 div cvi WB add def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 12 mul 8 div Y BPL mul add WB add
    X 0 eq {
      RGBData 1 index WB sub cvi
      MaskData Y WB mul WB getinterval
      putinterval
    } if
    RGBData
    dup 2 index         R put4bit
    dup 2 index 0.5 add G put4bit
    exch        1.0 add B put4bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB  4  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC  4  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD  4  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE  4  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF  4  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG  4  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH  4  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI  4  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed

% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==8, WM=.6*WD, HM=HD/2
%		IT 2 is line interleave -- Mask line follwoed by Data line
%		RGB Image Data must be chunky (MultipleDatasources==false).
  /YY YG def
  TX YY SY add moveto (\nIntType 2\nBPC=8\nWM=.6*WD\nHM=HD/2) blockshow
  
  % Generate the MaskData first
  /WM WD .6 mul cvi def
  /HM HD 2 div cvi def
  /saveHD HD def
  /HD HM 2 mul def		% make HD even for this exercise
  MaskGen

  % Generate the Data Image (uses the MaskData)
  /BPL WD 3 mul def		% BytesPerLine RGB Data
  /RGBData BPL HD mul WB HM mul add string def
  { X 3 mul Y BPL mul add Y 2 div cvi 1 add WB mul add	% 3 bytes Red,Green,Blue + Mask
    X 0 eq Y 1 and 0 eq and {			% Do one row of Mask every other image row
      RGBData 1 index WB sub
      MaskData Y 2 div cvi WB mul WB getinterval
      putinterval
    } if
    RGBData
    dup 2 index        R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch        2 add B 255 mul cvi put
  }
  ImageGen

%DEBUG	/xx (xx) (w) file def
%DEBUG	0 1 HM 1 sub { MaskData exch WB mul WB getinterval xx exch writehexstring xx (\n) writestring } for
%DEBUG	xx (----------------------------------------------------------------\n) writestring
%DEBUG	0 2 HD 1 sub { 
%DEBUG	  RGBData 1 index BPL mul 2 index 2 div cvi WB mul add
%DEBUG	  WB getinterval xx exch writehexstring xx (\n) writestring
%DEBUG	  RGBData 1 index BPL mul 2 index 2 div cvi 1 add WB mul add
%DEBUG	  BPL getinterval xx exch writehexstring xx (\n) writestring
%DEBUG	  RGBData 1 index 1 add BPL mul 2 index 2 div cvi 1 add WB mul add
%DEBUG	  BPL getinterval xx exch writehexstring xx (\n) writestring
%DEBUG	  pop
%DEBUG	} for
%DEBUG	xx closefile

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB  8  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC  8  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD  8  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE  8  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF  8  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG  8  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH  8  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI  8  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed

   /HD saveHD def		% put odd HD back

% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==8, WM=1.3*WD, HM=2*HD
%		IT 2 is line interleave -- Mask line follwoed by Data line
%		RGB Image Data must be chunky (MultipleDatasources==false).
  /YY YH def
  TX YY SY add moveto (\nIntType 2\nBPC=8\nWM=1.3*WD\nHM=2*HD) blockshow
  
  % Generate the MaskData first
  /WM WD 1.3 mul cvi def
  /HM HD 2 mul def
  MaskGen

  % Generate the Data Image (uses the MaskData)
  /HR HM HD div cvi def
  /BPL WD 3 mul WB HR mul add cvi def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 3 mul Y BPL mul add WB HR mul add 	% 3 bytes Red,Green,Blue + Mask Bytes
    X 0 eq {				% Do HM/HD rows of Mask
      RGBData 1 index WB HR mul sub
      MaskData Y WB HR mul mul WB HR mul getinterval
      putinterval
    } if
    RGBData
    dup 2 index        R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch        2 add B 255 mul cvi put
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB  8  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC  8  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD  8  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE  8  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF  8  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG  8  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH  8  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI  8  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==12, WM=1.3*WD, HM=2*HD
  /YY YI def
  TX YY SY add moveto (\nIntType 2\nBPC=12\nWM=1.3*WD\nHM=2*HD) blockshow
  
  % Generate the Data Image (uses the MaskData)
  /HR HM HD div cvi def
  /BPL WD 36 mul 7 add 8 div cvi WB HR mul add def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 36 mul 8 div Y BPL mul add WB HR mul add
    X 0 eq {
      RGBData 1 index WB HR mul sub cvi
      MaskData Y WB HR mul mul WB HR mul getinterval
      putinterval
    } if
    RGBData
    dup 2 index         R put12bit
    dup 2 index 1.5 add G put12bit
    exch        3.0 add B put12bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB 12  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC 12  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD 12  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE 12  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF 12  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG 12  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH 12  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI 12  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 2, BPC==4, WM=1.3*WD, HM=2*HD
  /YY YJ def
  TX YY SY add moveto (\nIntType 2\nBPC=4\nWM=1.3*WD\nHM=2*HD) blockshow
  
  % Generate the Data Image (uses the MaskData)
  /HR HM HD div cvi def
  /BPL WD 12 mul 7 add 8 div cvi WB HR mul add def		% BytesPerLine
  /RGBData BPL HD mul string def
  { X 12 mul 8 div Y BPL mul add WB HR mul add
    X 0 eq {
      RGBData 1 index WB HR mul sub cvi
      MaskData Y WB HR mul mul WB HR mul getinterval
      putinterval
    } if
    RGBData
    dup 2 index         R put4bit
    dup 2 index 0.5 add G put4bit
    exch        1.0 add B put4bit
  }
  ImageGen

  % X BPC matrix source  multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB RGBData false  [0 1]    [1 0 1 0 1 0]  2 DoImage3
   XB  4  IMLRTB RGBData false  [1 0]    [1 0 1 0 1 0]  2 DoImage3
   XC  4  IMLRTB RGBData false  [0 1]    [0 1 0 1 0 1]  2 DoImage3
   XD  4  IMLRTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XE  4  IMLRBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XF  4  IMRLTB RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XG  4  IMRLBT RGBData false  [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XH  4  IMLRTB RGBDProc false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   XI  4  IMLRTB RGBDFile false [1 0]    [0 1 0 1 0 1]  2 DoImage3
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed

  showpage
% ----------------------------------------------------------------------

  % Use an unusual (unpleasant?) underlying color
  .6 .95 .4 setrgbcolor clippath fill

  0 0 0 setrgbcolor
  TitleFont setfont
  200 760 moveto (Image Type 3 Tests) show
  200 740 moveto (Rotation Angle = ) show IR 3 string cvs show
  200 720 moveto (InterleaveType 3) show
  170 700 moveto (Colorspace = ) show CSpaceName show
  LegendFont setfont

  .4 .1 .7 setrgbcolor	% contrasting color for stencil masking

% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==8, WM=WD, HM=HD
%		IT 3 is line interleave -- Mask and Data in separate sources
%		RGB Image Data chunky (MultipleDatasources==false).
  /YY YA def
  TX YY SY add moveto (BPC=8\nMulti\nfalse) blockshow
  
  % Generate the MaskData first
  /WM WD def
  /HM HD def
  MaskGen

  % Generate the Data Image
  /RGBData WD HD mul 3 mul string def
  { X Y WD mul add 3 mul RGBData
    dup 2 index R 255 mul cvi put
    dup 2 index 1 add G 255 mul cvi put
    exch 2 add B 255 mul cvi put
  } ImageGen

  % X BPC matrix source                 multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  8  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  8  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  8  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  8  IMLRBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  8  IMRLTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  8  IMRLBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  8  IMLRTB [ MaskDProc RGBDProc ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  8  IMLRTB [ MaskDFile RGBDFile ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==12, WM=WD, HM=HD
  /YY YB def
  TX YY SY add moveto (BPC=12\nMulti\nfalse) blockshow
  
  /RGBData WD 36 mul 7 add 8 div cvi HD mul string def
  { 
    X 36 mul 8 div Y WD 36 mul 7 add 8 div cvi mul add
    RGBData 1 index R put12bit
    RGBData 1 index 1.5 add G put12bit
    RGBData exch 3 add B put12bit
  } ImageGen
  
  % X BPC matrix source                 multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB 12  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC 12  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD 12  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE 12  IMLRBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF 12  IMRLTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG 12  IMRLBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH 12  IMLRTB [ MaskDProc RGBDProc ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI 12  IMLRTB [ MaskDFile RGBDFile ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==4, WM=WD, HM=HD
  /YY YC def
  TX YY SY add moveto (BPC=4\nMulti\nfalse) blockshow
  
  /RGBData WD 12 mul 7 add 8 div cvi HD mul string def
  { 
    X 12 mul 8 div Y WD 12 mul 7 add 8 div cvi mul add
    RGBData 1 index         R put4bit
    RGBData 1 index 0.5 add G put4bit
    RGBData exch    1.0 add B put4bit
  } ImageGen
  
  % X BPC matrix source                 multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  4  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  4  IMLRTB [ MaskData  RGBData  ] false  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  4  IMLRTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  4  IMLRBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  4  IMRLTB [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  4  IMRLBT [ MaskData  RGBData  ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  4  IMLRTB [ MaskDProc RGBDProc ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  4  IMLRTB [ MaskDFile RGBDFile ] false  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RGBData (RGB) RGBDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==8, WM=WD, HM=HD
%		IT 3 is line interleave -- Mask and Data in separate sources
%		RGB Image Data seprate (MultipleDatasources==true).
  /YY YA def
  TX YY SY add moveto (BPC=8\nMulti\ntrue) blockshow
  
  % Generate the MaskData first
  MaskGen

  % Generate the Data Image
  WD HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { X Y WD mul add 
    RData 1 index R 255 mul cvi put
    GData 1 index G 255 mul cvi put
    BData exch    B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  8  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  8  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  8  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  8  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  8  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  

% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==8, WM=WD, HM=HD
%		IT 3 is line interleave -- Mask and Data in separate sources
%		RGB Image Data seprate (MultipleDatasources==true).
  /YY YD def
  TX YY SY add moveto (BPC=8\nMulti\ntrue) blockshow
  
  % Generate the MaskData first
  MaskGen

  % Generate the Data Image
  WD HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { X Y WD mul add 
    RData 1 index R 255 mul cvi put
    GData 1 index G 255 mul cvi put
    BData exch    B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  8  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  8  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  8  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  8  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  8  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==12, WM=WD, HM=HD
  /YY YE def
  TX YY SY add moveto (BPC=12\nMulti\ntrue) blockshow
  
  WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
    RData 1 index R put12bit
    GData 1 index G put12bit
    BData exch B put12bit
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE 12  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF 12  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG 12  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH 12  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI 12  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==4, WM=WD, HM=HD
  /YY YF def
  TX YY SY add moveto (BPC=4\nMulti\ntrue) blockshow
  
  WD 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 2 div Y WD 1 add 2 div cvi mul add
    RData 1 index R put4bit
    GData 1 index G put4bit
    BData exch    B put4bit
  } ImageGen
  
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  4  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  4  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  4  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  4  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  4  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==8, WM=.9*WD, HM=1.1*HD
%		IT 3 is line interleave -- Mask and Data in separate sources
%		RGB Image Data seprate (MultipleDatasources==true).
  /YY YG def
  TX YY SY add moveto (BPC=8\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow

  /WM 0.9 WD mul cvi def
  /HM 1.1 HD mul cvi def
  % Generate the MaskData first
  MaskGen

  % Generate the Data Image
  WD HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { X Y WD mul add 
    RData 1 index R 255 mul cvi put
    GData 1 index G 255 mul cvi put
    BData exch    B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  8  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  8  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  8  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  8  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  8  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==12, WM=WD, HM=HD
  /YY YI def
  TX YY SY add moveto (BPC=12\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow
  
  WD 3 mul 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 3 mul 2 div Y WD 3 mul 1 add 2 div cvi mul add
    RData 1 index R put12bit
    GData 1 index G put12bit
    BData exch B put12bit
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD 12  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE 12  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF 12  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG 12  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH 12  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI 12  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==4, WM=WD, HM=HD
  /YY YJ def
  TX YY SY add moveto (BPC=4\nMulti\ntrue\nWM=.9*WD\nHM=1.1*HD) blockshow
  
  WD 1 add 2 div cvi HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { 
    X 2 div Y WD 1 add 2 div cvi mul add
    RData 1 index R put4bit
    GData 1 index G put4bit
    BData exch    B put4bit
  } ImageGen
  
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  4  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  4  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  4  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  4  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  4  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  4  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
% ----------------------------------------------------------------------
% 		InterleaveType 3, BPC==8, WM=1.1*WD, HM=.9*HD
%		IT 3 is line interleave -- Mask and Data in separate sources
%		RGB Image Data seprate (MultipleDatasources==true).
  /YY YH def
  TX YY SY add moveto (BPC=8\nMulti\ntrue\nWM=1.1*WD\nHM=.9*HD) blockshow

  /WM 1.1 WD mul cvi def
  /HM 0.9 HD mul cvi def
  % Generate the MaskData first
  MaskGen

  % Generate the Data Image
  WD HD mul /RData 1 index string def
          /GData 1 index string def
  	/BData exch    string def
  { X Y WD mul add 
    RData 1 index R 255 mul cvi put
    GData 1 index G 255 mul cvi put
    BData exch    B 255 mul cvi put
  } ImageGen
  
  % X BPC matrix source                              multi MaskDecode DataDecode   IT DoImage3 -
   XA  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [1 0 1 0 1 0]  3 DoImage3
   XB  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [1 0 1 0 1 0]  3 DoImage3
   XC  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [0 1]    [0 1 0 1 0 1]  3 DoImage3
   XD  8  IMLRTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XE  8  IMLRBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XF  8  IMRLTB [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XG  8  IMRLBT [ MaskData  [RData  GData  BData] ] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XH  8  IMLRTB [ MaskDProc [RDProc GDProc BDProc]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   XI  8  IMLRTB [ MaskDFile [RDFile GDFile BDFile]] true  [1 0]    [0 1 0 1 0 1]  3 DoImage3
   MaskData (Mask) MDF CheckFileTail % Check that the correct amount of data was consumed
   RData (Red) RDF CheckFileTail % Check that the correct amount of data was consumed
   GData (Grn) GDF CheckFileTail % Check that the correct amount of data was consumed
   BData (Blu) BDF CheckFileTail % Check that the correct amount of data was consumed
  
  showpage
} bind def 	% T3Tests


% ----------------------------------------------------------------------
% 	Do the various rotations
%
/CSpace /DeviceRGB def

[ 0 10 -10 45 90 180 270 ]
pop [ 0 ]					% delete this line to enable tests
{ /IR exch def T1T4Tests } forall

[ 0 10 -10 45 90 180 270 ]
pop [ 0 ]					% delete this line to enable tests
{ /IR exch def T3Tests } forall

/CSpace [ /DeviceN [/Blue /Red /Green] /DeviceRGB { } ] def

[ 0 10 -10 45 90 180 270 ]
pop [ 0 ]					% delete this line to enable tests
{ /IR exch def T1T4Tests } forall

[ 0 10 -10 45 90 180 270 ]
pop [ 0 ]					% delete this line to enable tests
{ /IR exch def T3Tests } forall
     
          
  
      
   
     
    	       
               
  	 
   	 

 	?3̙	ffOw33	  4	ϙ	ff OO33
 OOFf	Dff	fJJ3	 	+K
ff KD3
 J$  	                                    
       
               H%    Copyright (C) 1992, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: impath.ps,v 1.3.4.1 2002/02/22 19:45:55 ray Exp $
% impath.ps
% Reverse-rasterize a bitmap to produce a Type 1 outline.
% (This was formerly a Ghostscript operator implemented in C.)

%	<image> <width> <height> <wx> <wy> <ox> <oy> <string>
%	  type1imagepath <substring>
%		Converts an image (bitmap) description of a character into
%		  a scalable description in Adobe Type 1 format.  The
%		  current transformation matrix should be the same as the
%		  FontMatrix of the font in which this character will be
%		  used: this establishes the scaling relationship between
%		  image pixels (the image is assumed to be 1 unit high in
%		  user space) and the character coordinate system used in
%		  the scalable description.  wx and wy are the character
%		  width, and ox and oy are the character origin relative
%		  to the lower left corner of the bitmap, in *pixels*.
%		The image is assumed to be stored in left-to-right,
%		  top-to-bottom order.  Note that this is not consistent
%		  with the `image' operator's interpretation of the CTM.
%		All coordinates in the scalable description are rounded to
%		  integers, so the coefficients in the FontMatrix should
%		  be on the order of 1/N for some value of N that is
%		  either a multiple of the height/width or is large
%		  compared to the width and height.  (There is a
%		  convention, which some PostScript programs rely on, that
%		  N=1000.)
%		Note that the encoded description has *not* been subjected
%		  to CharString encryption, which is necessary before the
%		  description can be given to type1addpath: to do this,
%		  follow the type1imagepath with
%			4330 exch dup .type1encrypt exch pop
%		If the description is too complex to fit into the supplied
%		  string, a limitcheck error results.  A good rule of
%		  thumb is that the size of the string should be about 6
%		  times the number of 1-bits in the image that are not
%		  completely surrounded by other 1-bits.

% Import the Type 1 opcodes.
(type1ops.ps) runlibfile

100 dict
dup /type1imagepath_dict exch def
begin

/rc { round cvi } bind def
/moving [/rmoveto /hmoveto /vmoveto] def
/drawing [/rlineto /hlineto /vlineto] def

% Convert the current path to a Type 1 token array.
/putxy			% x y ops -> cs_elements
 { 3 -1 roll dup x sub rc exch /x exch def
   3 -1 roll dup y sub rc exch /y exch def
   % stack: ops dx dy
   dup 0 eq
    { % dy = 0, use hmoveto/lineto
      pop exch 1 get
    }
    { 1 index 0 eq
       { % dx = 0, use vmoveto/lineto
         exch pop exch 2 get
       }
       { % use rmoveto/rlineto
         3 -1 roll 0 get
       }
      ifelse
    }
   ifelse
 } bind def
/pathtotype1		% -> charstack
 { 3 dict begin /x 0 def /y 0 def
   mark
   { moving putxy
   }
   { drawing putxy
   }
   { % Convert curve to relative form
     x y 3
      { exch neg 7 index add rc
	exch neg 6 index add rc
	8 -2 roll
      }
     repeat /y exch def /x exch def
     1 index 0 eq 5 index 0 eq and	% dy1=dx3=0, hv
      { 5 -1 roll pop exch pop /hvcurveto
      }
      { dup 0 eq 6 index 0 eq and	% dx1=dy3=0, vh
         { 6 -1 roll pop pop /vhcurveto
	 }
	 { /rrcurveto			% none of the above
	 }
	ifelse
      }
     ifelse
   }
   { /closepath
   }
   pathforall end
 } bind def

end	% type1imagepath_dict

% The main program
/type1imagepath		% image width height wx wy ox oy string ->
			% substring
 { type1imagepath_dict begin
   /tsave save def
   /ostring exch def
   /oy exch def   /ox exch def
   /wy exch def   /wx exch def
   /height exch def   /width exch def
   /data exch def

   /ofilter ostring /NullEncode filter def
   /raster width 7 add 8 idiv def

% Construct the coordinate transformation.
   height dup scale
     matrix currentmatrix matrix invertmatrix setmatrix

% Determine the left side bearing.
   /lsbx width
   0 1 width 1 sub
    { dup dup 8 idiv 0 exch
      raster raster height mul 1 sub
       { data exch get or }
      for exch 8 mod bitshift 128 and 0 ne
       { exch pop exit }
      if pop
    }
   for def

% Compute and encode the origin, width, and side bearing.
   mark
   ox oy dtransform
     rc /opty exch def   rc /optx exch def
   wx wy dtransform
     rc /iwy exch def	rc /iwx exch def
   lsbx ox sub 0 dtransform
     rc /ilsby exch def   rc /ilsbx exch def
   ilsbx
   iwy 0 ne ilsby 0 ne or
    { ilsby iwx iwy /sbw }
    { iwx /hsbw }
   ifelse
   ofilter charstack_write

% Flip over the Y axis, because the image is stored top-to-bottom.
   [1 0 0 -1 0 height] concat
% Account for the character origin.
   lsbx oy translate
% Trace the outline.
   newpath
   width height data .imagepath
   gsave matrix setmatrix pathtotype1 grestore
   ofilter charstack_write
% Terminate the output
   mark /endchar ofilter charstack_write

   ofilter .fileposition ofilter closefile	% flush buffers
   ostring 0 3 -1 roll getinterval
   tsave restore
   end
 } bind def
   p  <yBD                       )                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          %    Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: jispaper.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Select JIS B paper sizes for b0...b6.

userdict begin
  /b0 /jisb0 load def
  /b1 /jisb1 load def
  /b2 /jisb2 load def
  /b3 /jisb3 load def
  /b4 /jisb4 load def
  /b5 /jisb5 load def
  /b6 /jisb6 load def
end
0.D@HЮ @Rn0.nm0.HѮ0.HѮRn0.nm` F-n nS-HBn                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %!
%  landscap.ps
% This file can be prepended to most PostScript pages to force 
% rotation to "landscape" mode.
%
% There are (at least) four possible ways to reasonably position a
% page after rotation.  Any of the four old corners (llx,lly e.g.)
% can be moved to match the corresonding new corner.
% By uncommmenting the appropriate line below (i.e., remove the 
% leading '%'), any such positioning can be chosen for positive or
% negative rotation.  The comments at the end of each "rotate" line
% indicate the ORIGINAL corner to be aligned. For example, as given
% below, the lower left hand corner is aligned.  When viewed, this 
% corner will have moved to the urx,lly corner.
%
%  James E. Burns, 3/8/93, burns@nova.bellcore.com
%
% $Id: landscap.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
%
gsave clippath pathbbox grestore
4 dict begin
/ury exch def /urx exch def /lly exch def /llx exch def
%90 rotate  llx neg               ury neg              translate  % llx,ury
90 rotate  llx neg               llx urx sub lly sub  translate  % llx,lly
%90 rotate  ury lly sub urx sub   ury neg              translate  % urx,ury
%90 rotate  ury lly sub urx sub   llx urx sub lly sub  translate  % urx,lly
%-90 rotate urx neg               lly neg              translate  % urx,lly
%-90 rotate urx neg               urx llx sub ury sub  translate  % urx,ury
%-90 rotate llx lly add ury sub   urx llx sub ury sub  translate  % llx,ury
%-90 rotate llx lly add ury sub   lly neg              translate  % llx,lly
end
/. /. /NhlO                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %!
% $Id: level1.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $
/.setlanguagelevel where { pop 1 .setlanguagelevel } if
hmШHx !bBn` /NhX0.HЀГ @=hV S0.h o   S0.h$l  0.HГ @Jh~f?. S?(?. S?("`  0.HГ @0(~HЀГ @=hh S0.ho" S0.h"l?. S?(?.?.0.HГ @0(HЀГ @=hh S0.ho" S0.h"l?.?.?. S?("Rnn m Bn` /NhX0.HЀГ @=hh S0.ho   S0.h"l  0.HГ @Jhf S?( ?. S?($?.`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %!
%   Copyright (C) 1989, 1990, 1992, 1994, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: lines.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Test line rendering (stroke).

% Exercise the miter limit.  The left column of lines should bevel at
% 90 degrees, the right column at 60 degrees.

gsave
1.8 setlinewidth
0 setgray
15 15 scale
-5 5 translate
[1.415 2.0]
 { setmiterlimit 12 0 translate 0 0 moveto
   10 30 360
    { gsave 5 0 rlineto rotate 2.5 0 rlineto
      gsave 0 setlinewidth 1 0 0 setrgbcolor stroke grestore
      strokepath 0 setlinewidth stroke
      grestore
      0 4 rmoveto
    } for
 } forall

showpage
grestore

% Exercise all the combinations of cap and join styles
% for one-line, two-line, and closed paths.

gsave

/drawlines {
gsave
2.0 setmiterlimit
2.0 setlinewidth
6 6 scale
5 20 translate
{0 1 2}				% line cap
 { setlinecap gsave
   {0 1 2}			% line join
    { setlinejoin gsave
      { {currentpoint lineto}
	{3 7 lineto}
	{3 7 lineto 5 1 lineto}
	{3 7 lineto 6 3 lineto closepath}
      }
       { gsave 0 0 moveto exec
         gsave stroke grestore
	 0.5 setlinewidth 1 0 0 setrgbcolor stroke
	 grestore 8 0 translate
       } forall
      grestore 35 0 translate
    } forall
   grestore 0 20 translate
 } forall
grestore
} def
/xflip
 { 8.5 72 mul 0 translate -1 1 scale
 } def
/rot90
 { 90 rotate 0 -9.75 72 mul translate
 } def
/rot180
 { rot90 rot90
 } def
/rot270
 { rot180 rot90
 } def

drawlines showpage
gsave xflip drawlines grestore showpage
gsave rot90 drawlines grestore showpage
gsave rot90 xflip drawlines grestore showpage
gsave drawlines rot180 showpage
gsave rot180 xflip drawlines grestore showpage
gsave rot270 drawlines grestore showpage
gsave rot270 xflip drawlines grestore showpage
grestore

% Here are some boundary conditions, contributed by Mark Rawling.

gsave
1 setlinecap
2.6 setmiterlimit
3.0 setlinewidth

5 5 scale
10 20 translate

% [ 0.5 sqrt dup dup dup neg exch 0 0 ] concat	% 45 rotate

{0 1 2}                        % line join
{
    setlinejoin gsave
    0 0 moveto 0 10 lineto 10 0 lineto gsave stroke grestore
    15 0 translate
    0 0 moveto 0 10 lineto 10 20 lineto gsave stroke grestore
    15 0 translate
    10 0 moveto 10 10 lineto 0 20 lineto gsave stroke grestore
    15 0 translate
    10 0 moveto 10 10 lineto 0 0 lineto gsave stroke grestore
    grestore
    gsave
    0 20 translate
    0 20 moveto 0 10 lineto 10 20 lineto gsave stroke grestore
    15 0 translate
    0 20 moveto 0 10 lineto 10 0 lineto gsave stroke grestore
    15 0 translate
    10 20 moveto 10 10 lineto 0 0 lineto gsave stroke grestore
    15 0 translate
    10 20 moveto 10 10 lineto 0 20 lineto gsave stroke grestore
    grestore 60 0 translate
} forall

showpage
grestore

% Test narrow lines at a variety of angles.

gsave

/rad 120 def
/ray { gsave rotate 0 0 moveto rad 0 rlineto stroke grestore } def
/star
 { newpath gsave
   gsave 0.5 setgray 0 0 rad 0 360 arc stroke grestore
   0 90 359
    { rotate 
      0 3 14 { ray } for
      15 15 89 { ray } for
    } for
   grestore
 } def

0 setgray
150 150 translate
[ [ 0 0.5 1 ] [ 1.5 2 2.5 ] [ 3 3.5 4 ] ]
 { gsave
    { setlinewidth star
      250 0 translate
    } forall
   grestore 0 250 translate
 } forall

grestore showpage

% End

quit
"RnHnȨ{SnHnȨpHn̨p n 0h    	WD H=@HnBgBg?< ?< ШHnBgBg?< ?< Jnf.BgHnN,\BgHn-@N,\ЮѮ .Ѐ-@n gn f8BgBgHnHnN-O ѮBgBgHnHnN- O Ѯ  40.S@ %    Copyright (C) 1990-2002 artofcode LLC. All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: ps2epsi.ps,v 1.5.2.3 2002/04/22 20:30:39 giles Exp $
% Convert an arbitrary PostScript file to an EPSI file.
%
% Please do not contact these users if you have questions.  They no longer
% have the time, interest, or current expertise to keep this code working.
% If you find bugs, please send proposed fixes to bug-gs@aladdin.com.
%
% Bug fix 2002-04-20 by rayjj: Bounding box was incorrect since it depended
%   on the dither pattern and gray shade at the boundary. Changed to use
%   8-bit grayscale preview image to allow correct bounding box (at the
%   expense of a 8x larger preview image). Also moved .setsafe until after
%   the device and file operations are complete (but still before the input
%   file is processed.
% Bug fix 2000-04-11 by lpd: if a font didn't have a FontName (which is the
%   case for bitmap fonts produced by recent versions of dvips), setfont
%   caused an error.
% Bug fix 8/21/99 by lpd: many of the margin and width computations were
%   wrong (off by 1).  The code only "worked" because the bugs were
%   (mostly) in conservative directions.
% Modified 3/17/98 by lpd to make it possible to run this file without
%   running the ps2epsi script first, for debugging.
% Bug fix 9/29/97 by lpd <ghost@aladdin.com>: if the page size wasn't an
%   exact multiple of 8 bits, an incorrect bounding box (or a rangecheck
%   error) could occur.
% Patched 7/26/95 by
%	Greg P. Kochanski <gpk@bell-labs.com>
%   to add many new DSC comments and make the comments conforming.
% Original version contributed by
%	George Cameron <george@bio-medical-physics.aberdeen.ac.uk>
%

% Initialize, and redefine copypage and showpage.

% ps2edict is normally defined in the pre-loaded code created by the
% ps2epsi script.
/ps2edict where { pop } { /ps2edict 25 dict def } ifelse
ps2edict begin

				% The main procedure
  /ps2epsi
   {				% Open the file
     outfile (w) file /epsifile exch def
%     outfile2 (w) file /bboxfile exch def
					% Get the device parameters
     currentdevice getdeviceprops .dicttomark 
     /HWSize get aload pop
       /devheight exch def
       /devwidth exch def
     matrix defaultmatrix
       /devmatrix exch def
				% Make a corresponding 8-bit deep memory device
     devmatrix devwidth devheight
     256 string 0 1 255 { 1 index exch dup 255 exch sub put } for
     makeimagedevice
     /arraydevice exch def
     arraydevice
     % Turn on anti-aliasing
     mark /TextAlphaBits 4 /GraphicsAlphaBits 4 6 -1 roll
     putdeviceprops
     setdevice	% (does an erasepage)
     /rowwidth devwidth def
     /row rowwidth string def
     /zerorow rowwidth string def	% all zero
				% Replace the definition of showpage
     userdict /showpage { ps2edict begin epsipage end } bind put
     userdict /setfont { ps2edict begin epsisetfont end } bind put
     //systemdict /.setsafe known { .setsafe } if
   } bind def

 /epsifontdict 100 dict def

 /epsisetfont
 {
 % code here keeps a list of font names in dictionary epsifontdict
 /tmpfont exch def
 tmpfont /FontName known {
   /tmpfontname tmpfont /FontName get def
   epsifontdict tmpfontname known not { epsifontdict tmpfontname 0 put } if
   epsifontdict tmpfontname 2 copy get 1 add put
 } if
 tmpfont setfont
 } bind def

% Get a scan line from the memory device, zeroing any bits beyond
% the device width.
/getscanline {		% <device> <y> <string> getscanline <string>
  dup 4 1 roll copyscanlines pop
  16#ff00 devwidth 7 and neg bitshift 255 and
  dup 0 ne {
    1 index dup length 1 sub 2 copy get 4 -1 roll and put
  } {
    pop
  } ifelse
} bind def

/margintest {		% <y-start> <step> <y-limit> margintest <y-non-blank>
			% <y-start> <step> <y-limit> margintest -
  { dup arraydevice exch row getscanline
    zerorow ne { exit } if pop
  } for
} bind def


  /epsiNameStr 200 string def
  /epsiNpages 0 def
  /epsiNpageStr 20 string def
  /epsipage
   {      
     /epsiNpages epsiNpages 1 add def
     /loopcount devheight 1 sub def

     % Find top margin -- minimum Y of non-blank scan line.
     -1 0 1 loopcount margintest
     dup -1 eq { (blank page!!\n) print quit }{ exch pop } ifelse 
     /tm exch def

     % Find bottom margin -- maximum Y of non-blank scan line.
     loopcount -1 0 margintest
     /bm exch def
     
     % Initialise limit variables
     /loopcount rowwidth 1 sub def
     /lm loopcount def 
     /rm 0 def 

     % Find left and right boundaries of image
     tm 1 bm
      { % Get more data
	arraydevice exch row getscanline pop
	% Scan from left to find first non-zero element
	% We save first the element, then the index
	-1 0 1 loopcount
	{ dup row exch get 0 ne { exch pop exit }{ pop } ifelse
	} for
	% If we found -1, row is blank ..
	dup -1 ne 
	{ % Find the leftmost index
          dup lm lt
          % If the new index is less, we save index and element
          { /lm exch def } { pop } ifelse
	  % Now find the rightmost index
	  loopcount -1 0
          { dup row exch get 0 ne { exit }{ pop } ifelse
          } for
	  dup rm gt
          % If the new index is greater, we save index and element
          { /rm exch def } { pop } ifelse
	} if
      } for

     % Calculate the bounding box values.
     % Note that these must be corrected to produce closed-open intervals.
     /llx lm def
     /lly devheight bm sub 1 sub def
     /urx rm 1 add def
     /ury devheight tm sub def

    % Write out the magic string and bounding box information
     epsifile (%!PS-Adobe-2.0 EPSF-1.2\n) writestring
	 /epsititle where { pop epsifile epsititle writestring } if
	 /epsicreator where { pop epsifile epsicreator writestring } if
	 /epsicrdt where { pop epsifile epsicrdt writestring } if
	 /epsifor where { pop epsifile epsifor writestring } if
     epsifile flushfile

	% Write out the page count:
	 epsifile (%%Pages: ) writestring
	 epsifile epsiNpages epsiNpageStr cvs writestring
	 epsifile (\n) writestring
     epsifile flushfile

	% Write out the list of used fonts:
	 epsifile (%%DocumentFonts:) writestring
	 epsifontdict {
					epsifile ( ) writestring
					pop epsiNameStr cvs epsifile exch writestring
					} forall
	 epsifile (\n) writestring
     epsifile flushfile

     epsifile (%%BoundingBox: ) writestring
     epsifile llx write==only epsifile ( ) writestring
     epsifile lly write==only epsifile ( ) writestring
     epsifile urx write==only epsifile ( ) writestring
     epsifile ury write==
%     bboxfile llx write==only bboxfile (,) writestring
%     bboxfile lly write==only bboxfile (,) writestring
%     bboxfile urx write==only bboxfile (,) writestring
%     bboxfile ury write==only
%     epsifile (%%BeginPreview: ) writestring
%     epsifile urx llx sub write==only epsifile ( ) writestring
%     epsifile bm tm sub 1 add write==only epsifile ( 1 ) writestring
%     epsifile bm tm sub 1 add write==
%     epsifile flushfile

%    % Define character and bit widths for the output line buffer:
%     /cwidth rm lm sub 1 add def
%     /bwidth cwidth 8 mul def
%     /owidth urx llx sub 7 add 8 idiv def
%     /out cwidth string def

%     % Create a 1-bit-high device for bitblt to align with the bbox
%     gsave
%     matrix cwidth 8 mul 1 <00 ff> makeimagedevice setdevice

%     % 'image' a zero string to clear the line device
%     bwidth 1 1 matrix cwidth string image

%     tm 1 bm
%      { % Get a scan line interval from the array device
%	arraydevice exch row copyscanlines lm cwidth getinterval
%	lmb 0 gt
%	{ % 'image' it into the line device with the lmb offset
%	  bwidth 1 1 [1 0 0 1 lmb 0] 5 -1 roll image
%	  % Now we get the modified scan line
%	  currentdevice 0 out copyscanlines 0 owidth getinterval
%	} if
%	% Write out the hex data
%	epsifile (% ) writestring 
%	epsifile exch writehexstring
%	epsifile (\n) writestring
%      } for

%     epsifile (%%EndImage\n) writestring
%     epsifile (%%EndPreview\n) writestring
     epsifile flushfile
     grestore
     erasepage initgraphics

     DonePage 0 1 put
   } bind def


%(outfile) getenv
true
  { headfile /outfile exch def 
%    bboxfile /outfile2 exch def 
    ps2epsi

    /DonePage 1 string def
    infile (r) file cvx execute0
    DonePage 0 get 0 eq { showpage } if
  } if

end
quit

INITPORTNV  /&n /NX&_N^NuDISPOSE NV/&n  S h 0< h J@g. S h -h Bg/.Nv S@ /.N. n `
 S h T &_N^NuGETBITS NV/&n  S h 0< h J@g S h -h /. S( N&_N^NuRELEASEBNV  /&n  S ( &_N^NuGETGRAFPNV  /&n &_N^NuINITTHEPNV  /&n /N"X&_N^NuDISPOSE NV/&n Hnt n0< h J@g, n-h Bg/.Nx S@ /.N0 n ` nT &_N^Nu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     p  p   Z                                macps2eps.psentsonsrrd0.sitttsI  PartSIT!                        KZ                                                                                                                                           H 	Monaco                             Ql! Ql!Z         R*ch                                                                                                                          Courier                                                                                                                                                                                                                                                         
   	Helvetica                                                                                                                                                                                                                                                      Confidential                                                                                                                                                                                                                                                                                  P                                                                                                                p  p   ZL|   Z MPSR   BBST   &MWBB   2            L      h    mnhm~hmgmgm>gmVgg``````
````NqNmN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1994, 1995, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: markhint.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% markhint.ps
% Draw the hints for a Type 1 font.

(type1ops.ps) runlibfile

/mhsetup		% <matrix> <print> mhsetup -
 { /mhprint exch def
   /mhmx exch def
   /mhdash 0 9 gsave initmatrix dtransform grestore idtransform add abs def
   gsave
   clippath pathbbox
   2 index sub /bbh exch def
   2 index sub /bbw exch def
   /bby exch def
   /bbx exch def
   grestore
 } def

/markfonthints		% <matrix> <print> markfonthints -
 { mhsetup
 } def

/hmark			% <y> hmark -
 { bbx exch moveto bbw 0 rlineto stroke
 } def
/hsmark			% <y0> <dy> hsmark -
 { 1 index add exch gsave
   [mhdash] 0 setdash 0 exch mhmx transform exch pop hmark
   [mhdash 2 div dup 2 mul] 0 setdash 0 exch mhmx transform exch pop hmark
   grestore
 } def
/vmark			% <x> vmark -
 { bby moveto 0 bbh rlineto stroke
 } def
/vsmark			% <x0> <dx> vsmark -
 { 1 index add exch gsave
   [mhdash] mhdash setdash 0 mhmx transform pop vmark
   [mhdash 2 div dup 2 mul] 0 setdash 0 mhmx transform pop vmark
   grestore
 } def
/pmark			% <x> <y> pmark -
 { newpath 0 4.5 gsave initmatrix dtransform grestore idtransform add abs
   0 360 arc stroke
 } def
/mchdict mark
  /hsbw { pop 0 mhmx transform translate 0 0 pmark }
  /sbw { pop pop mhmx transform translate 0 0 pmark }
  /hstem
   { mhprint { (hstem ) print 2 copy 2 packedarray == } if
     hsmark
   }
  /vstem
   { mhprint { (vstem ) print 2 copy 2 packedarray == } if
     vsmark
   }
  /hstem3
   { mhprint { (hstem3 ) print 6 copy 6 packedarray == } if
     3 { hsmark } repeat
   }
  /vstem3
   { mhprint { (vstem3 ) print 6 copy 6 packedarray == } if
     3 { vsmark } repeat
   }
  /div
   { div
   }
  /callothersubr
   { 3 eq
      { pop
	mhprint { (replace) = } if
		% We're replacing hints; lighten the color.
	currentrgbcolor 3 { 2 mul 3 div 3 1 roll } repeat setrgbcolor
      }
      { { pop } repeat
      } ifelse
   }
  /callsubr
   { Private /Subrs get exch get mchinterp
   }
  /pop
   {
   }
  /return
   {
   }
.dicttomark def

/mchinterp		% <charstring> mchinterp -
 { 4330 exch dup length string .type1decrypt exch pop
   dup length lenIV sub lenIV exch getinterval
   0 () /SubFileDecode filter
   mark exch charstack_read ]
    { dup type /nametype eq
       { mchdict exch .knownget { exec } { cleartomark mark } ifelse
       }
      if
    }
   forall
 } def

/markcharhints		% <charname> <matrix> <print> markcharhints -
 { mhsetup
   gsave mark
   /Private currentfont /Private get def
   Private rcheck	% make sure we won't get an access error
    { /lenIV Private /lenIV .knownget not { 4 } if def
      currentfont /CharStrings get 3 -1 roll get mchinterp
    }
    { (Sorry, this font is protected; I can't show the hints.\n) print flush
      exch
    }
   ifelse
   cleartomark grestore
 } def
Ufg  3DUEDEEVVh  C3EETDTTUVg9  35TUEDEEUUg8  	D#TDTTDTUeVfy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  %    Copyright (C) 1993 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: markpath.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% markpath.ps
% Mark the corners of a path, drawing it slowly if desired.

/Delay where { pop } { /Delay 0 def } ifelse
/setxy0
 { currentpoint /y0 exch def /x0 exch def
 } def
/bip
 { epsx epsy idtransform /ey exch def /ex exch def
   currentpoint ex 2 div ey 2 div rlineto currentpoint 0 ey neg rlineto
   ex neg 0 rlineto 0 ey rlineto lineto lineto
   stroke
 } def
/dally
 { Delay { } repeat
   Delay 0 ne { flushpage } if
 } def
/movebip
 { /xs 2 index def /ys 1 index def
   gsave newpath mpmx transform moveto setxy0 bip grestore
 } def
/linebip
 { gsave newpath x0 y0 moveto mpmx transform lineto setxy0 bip dally grestore
 } def
/curvebip
 { gsave newpath x0 y0 moveto 5 index 5 index mpmx transform lineto bip
   2 copy mpmx transform moveto 3 index 3 index mpmx transform lineto bip
   x0 y0 moveto
   3 { mpmx transform 6 2 roll } repeat
   curveto setxy0 bip dally grestore
 } def
/closebip
 { xs ys linebip
 } def

/markpath		% <matrix> markpath -
 { /mpmx exch def 
   gsave initgraphics 9 dup dtransform grestore
     /epsy exch def   /epsx exch def
   gsave 0 setlinewidth
    { movebip } { linebip } { curvebip } { closebip } pathforall
   grestore
 } def
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   %    Copyright (C) 1994, 1995, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: packfile.ps,v 1.2.6.2 2002/04/02 13:57:27 mpsuzuki Exp $
% packfile.ps
% Pack groups of files together, with compression, for use in
% storage-scarce environments.

% ****** NOTE: This file must be kept consistent with gs_pfile.ps.

% ---------------- Huffman coding utilities ---------------- %

% We count runs of zeros, and individual byte frequencies separately
% depending on whether they follow or do not follow a run of zeros.
/zruns 256 array def
/zfreq 256 array def
/nzfreq 256 array def
/maxcode 13 def		% max code length, must be between 10 and 16
/maxzrun 100 def	% max length of zero run, must be <= 100
/statbuf 10000 string def

% Initialize statistics.
/initstats		% - initstats -
 { 0 1 255 { zruns exch 0 put } for
   0 1 255 { zfreq exch 0 put } for
   0 1 255 { nzfreq exch 0 put } for
 } bind def

% Accumulate statistics from an individual file.
/addstats		% <file> addstats -
 { 0
    { 1 index //statbuf readstring 3 1 roll
	% Stack: file eof numzeros data
       { dup 0 eq
	  { pop 1 add
	  }
	  { 1 index 0 ne
	     { exch 255 .min
	       //zruns exch 2 copy get 1 add put
	       0 exch //zfreq
	     }
	     { //nzfreq
	     }
	    ifelse
	    exch 2 copy get 1 add put
	  }
	 ifelse
       } forall
      exch not { exit } if (.) print flush
    } loop
   pop closefile
 } bind def

% Compute the Huffman codes from the statistics.
/statcodes		% - statcodes <array>
 { maxcode 1 add 256 add maxzrun 2 sub add 1 add array	% full array
   dup maxcode 1 add dup 2 index length exch sub getinterval	% data
	% Put statistics into array
   dup 0 1 255
    { zfreq 1 index get nzfreq 2 index get add put dup
    } for
   0 zruns 1 get put
   256 zruns 2 maxzrun 2 sub getinterval putinterval
   dup dup length 1 sub 1 put	% EOD
   maxcode .computecodes
 } bind def

% ---------------- File handling ---------------- %

% Copy one file to another.
% Close the input file, but not the output file.
/copyfile		% <infile> <outfile> copyfile <outfile> <length>
 { 0 mark statbuf
    { 4 index 1 index readstring
      exch 5 index 1 index writestring
      length 5 -1 roll add 4 1 roll
      not { exit } if (.) print flush
    } loop
   cleartomark 3 -1 roll closefile dup == flush
 } bind def

% Represent a Type 1 font in its most compressed format.
% Requires -dWRITESYSTEMDICT to run.
% Does not close the output file.
(wrfont.ps) runlibfile
/compressfont		% <fontname> <outfile> compressfont <outfile>
 { exch save
   systemdict /executeonly /readonly load put
   systemdict /noaccess /readonly load put
   systemdict readonly pop
   wrfont_dict begin
     /binary_CharStrings true def
     /binary_tokens true def
     /encrypt_CharStrings false def
     /standard_only false def
     /use_lenIV 0 def
     /smallest_output true def
   end
   exch findfont setfont
   1 index writefont
   restore
 } bind def

% ---------------- Main program ---------------- %

% Find the length of a file.
/filelength		% <filename> filelength <length>
 { status { pop pop exch pop } { -1 } ifelse
 } bind def

% Define the header string for a compressed file.
/beginfilestring
({dup token pop exch[/MaxCodeLength 2 index token pop/Tables 4 index token pop
/EndOfData true/EncodeZeroRuns 256 .dicttomark
/BoundedHuffmanDecode filter/MoveToFrontDecode filter
[/BlockSize 4 -1 roll .dicttomark/BWBlockSortDecode filter
}) readonly def

% Write a 16-bit big-endian non-negative integer on a file.
/write16		% <file> <int> write16 -
 { 2 copy -8 bitshift write 255 and write
 } bind def

% Compress a group of files together.
% Return a dictionary in which the keys are the input file names
% and the values are [startpos length] in the uncompressed concatenation.
% Does not open or close the output file.
/tempname (t.em) def
/packfiles		% <filenames> <outfile> packfiles <outfile> <posdict>
 {	% Concatenate files to a temporary file.
   tempname (w) file
   dup /MoveToFrontEncode filter
   dup <<
	/BlockSize 1000000
   >> /BWBlockSortEncode filter
		% Stack: filenames outfile tempfile mtfe bwe
   5 -1 roll dup length dict 0 6 2 roll
    {		% Stack: outfile posdict pos tempfile mtfe bwe infilename
      dup ==only dup (r) file 2 index copyfile exch pop
      dup 7 index 4 2 roll 7 index exch 2 array astore put
      5 -1 roll add 4 1 roll
    } forall
   closefile closefile closefile pop exch
		% Stack: posdict outfile
	% Compute an optimal Huffman code.
   initstats
   tempname (r) file addstats
	% Actually compress the file.
	% Write the decompression information on the output first.
   dup tempname filelength write==
   dup maxcode write==
	% Write the code table as a homogenous number array.
   statcodes exch
     dup 149 write dup 32 write dup 2 index length write16
     exch { 2 copy write16 pop } forall
   dup <<
	/MaxCodeLength maxcode
	/EndOfData true
	/EncodeZeroRuns 256
	/Tables statcodes
   >> /BoundedHuffmanEncode filter
   tempname (r) file exch copyfile pop closefile
   exch
 } bind def

% Squeeze a font to a .cpf file in anticipation of compression.
/squeezefont		% <fontname> squeezefont <filename.cpf>
 { dup type /nametype ne { cvn } if
   dup
    { dup type /stringtype eq { exit } if
      Fontmap exch get
    }
   loop
		% Stack: fontname filename
   dup dup
    { (.) search not { exit } if
      exch pop exch 3 -1 roll pop
    }
   loop
		% Stack: fontname filename noextname extension
   exch
    { (/) search not { (\\) search not { exit } if } if
      pop pop
    }
   loop
		% If the font extension is anything other than
		% .pfa or .pfb, we assume it can't be rewritten
		% using compressfont.
		% Stack: fontname filename extension basename
   (.cpf) concatstrings dup 5 1 roll (w) file
		% Stack: outfilename fontname filename extension outfile
   exch dup (pfa) eq exch (pfb) eq or
		% Stack: outfilename fontname filename outfile bool
    { exch pop compressfont
    }
    { 3 -1 roll pop
      exch findlibfile pop exch pop
      exch copyfile pop
    }
   ifelse closefile
 } bind def

% ---------------- Production code ---------------- %

% The following code constructs a packed version of the commercial-quality
% fonts available from Aladdin Enterprises.  To use this code:
%	- If desired, change the output file names below.
%	- Make sure you have the synthetic font data (fontmap.shs and the
%	  *.ps files for the commercial fonts) in a directory that is on
%	  Ghostscript's search path.
%	- Construct the packed fonts by running
%		gs -dNODISPLAY -dWRITESYSTEMDICT packfile.ps
%	- If desired, move the output files to the directory that will be
%	  used at run time.  You no longer need the *.pfb or *.ps files
%	  for the original fonts; however, you do still need the Fontmap
%	  for these fonts, because it defines the font name aliases.
%	- Add the following line to the end of gs_fonts.ps:
%		(ALL.cmp) run
%	  (substituting the definition of allmapname if you changed it).

% Define the output file names.  The extensions are arbitrary;
% any legal file name is allowed.
/allname (ALL.cff) def		% the compressed font file
/allmapname (ALL.cmp) def	% the Fontmap override file

% Load an alternate Fontmap that references the synthetic oblique and
% narrow fonts.
true .setglobal
(fontmap.shs) findlibfile pop exch pop .loadFontmap
false .setglobal

% Define the packaging of fonts into font groups.
% Fewer larger groups compress better, but make decompression slower.
/Lists [
[	% The oblique and narrow fonts are synthetic,
	% and take very little space.
  /AvantGarde-BookOblique /AvantGarde-DemiOblique
  /Courier-Oblique /Courier-BoldOblique
  /Helvetica-Oblique /Helvetica-BoldOblique
  /Helvetica-Narrow /Helvetica-Narrow-Oblique
  /Helvetica-Narrow-Bold /Helvetica-Narrow-BoldOblique
]
[/AvantGarde-Book /AvantGarde-Demi
 /Bookman-Light] [/Bookman-LightItalic
 /Bookman-Demi /Bookman-DemiItalic
 /Courier] [/Courier-Bold
 /Helvetica /Helvetica-Bold]
[/NewCenturySchlbk-Roman /NewCenturySchlbk-Italic
 /NewCenturySchlbk-Bold /NewCenturySchlbk-BoldItalic]
[/Palatino-Roman /Palatino-Italic
 /Palatino-Bold /Palatino-BoldItalic]
[/Times-Roman /Times-Italic
 /Times-Bold /Times-BoldItalic]
[/Symbol
 /ZapfChancery-MediumItalic
 /ZapfDingbats]
] def

% We need to register the fonts under their true names, not aliases.
/Lists Lists mark exch
 { mark exch
    {  { Fontmap 1 index get dup type /nametype ne { pop exit } if
	 exch pop
       }
      loop
    }
   forall ]
 }
forall ] def

% Squeeze the fonts to their .cpf format.
(Squeezing... ) print flush
/fdict mark
Lists
 { { dup squeezefont } forall } forall
.dicttomark def
(done.\n) print flush

% Invert fdict.
/f2dict fdict length dict def
fdict { exch f2dict 3 1 roll put } forall

% Construct the compressed font file.
(Creating ) print allname print (... ) print flush
/posdict fdict length dict def
/all allname (w) file def
all beginfilestring writestring
Lists
 { dup == flush
   /fbegin all fileposition def
   mark exch { fdict exch get } forall ]
   all packfiles exch pop
   /flength all fileposition fbegin sub def
    { fbegin flength 3 -1 roll aload pop 4 packedarray
      exch f2dict exch get exch posdict 3 1 roll put
    }
   forall
 }
forall
all closefile
(done.\n) print flush

% Write the Fontmap addendum for accessing compressed fonts.
(Writing ) print allmapname print (... ) print flush
allmapname (w) file
dup (%!
/.runpackedlibfile where{pop}{(gs_pfile.ps)runlibfile}ifelse
.currentglobal true .setglobal
) writestring
posdict
 { exch 2 index exch write==only exch dup ({) writestring
   dup allname write==only
   exch { 1 index dup ( ) writestring exch write==only } forall
   dup ( .runpackedlibfile}bind .definefontmap
) writestring
 }
forall
dup (.setglobal
) writestring
closefile
(done.\n) print flush
ЮЬ_ @B ,_/ /,_NЬ_Ь_ @B`   l_B ,_Ь_ @B/,_/,_NZЬ_ @B/,_/,_NDЬ_Ь_ @B ,_",_//,_-@NЮЬ_Hx /.-@N n  ,_Ь_ @  ,_/ /,_NЬ_ @ .N^NuINITMOUNNVH&l_,<   /,_/,_NS. ` Ћ @l
 Ћ @,SJl-FHnHn?<(AC  0A_/ / ? A/ / ? HnN:O AC  0Hl_Hn                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1990, 1992, 1997, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pcharstr.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% pcharstr.ps
% Print the CharStrings and Subrs (if present) from a Type 1 font,
% in either a PostScript-like or a C-compatible form,
% depending on whether CSFormat is defined as /PS or /C.

% Load the Type 1 utilities.
(type1ops.ps) runlibfile

% Define the printing procedures for PostScript-like output.
/pcs_ps_dict mark
  /, {( ) print}
  /charname {==only}
  /csbegin {}
  /beginchars {(%---------------- CharStrings\n) print}
  /charbegin {==only}
  /char1 {( ) print ==only}
  /endchars {}
  /beginsubrs {(%---------------- Subrs\n) print}
  /subrbegin {=only}
  /endsubrs {}
  /beginboxes {(%---------------- Encoding & metrics\n) print}
  /notdefbox {}
  /boxbegin {=only ( ) print}
  /boxend {(\n) print}
  /endboxes {(%----------------\n) print}
.dicttomark readonly def

% Define the printing procedures for C-like output.
/pcs_c_dict mark
  /, {(, ) print}
  /charname {(") print =only (") print}
  /csbegin {counttomark =only ,}
  /beginchars {(\nconstdata int CSCharData[] = {\n) print}
  /charbegin {pop}
  /char1 {=only ,}
  /endchars {
    (-1\n};\nconstdata char *CSCharNames[] = {\n) print
    CharStrings {pop charname ,} forall (0\n};\n) print
  }
  /beginsubrs {(\nconstdata int CSSubrs[] = {\n) print}
  /subrbegin {pop}
  /endsubrs {(-1\n};\n) print}
  /beginboxes {(\nconstdata type1_box CSboxes[] = {\n) print}
  /notdefbox {(  {""},\n) print}
  /boxbegin {pop (  {) print}
  /boxend {(},) =}
  /endboxes {(  {0}\n};\n) print}
.dicttomark readonly def

/printcs
 { dup type /stringtype eq
    { printcs1 (\n) print }
    { ( ) print == }
   ifelse
 } bind def
/printcs1
 { save exch
   lenIV 0 ge {
     4330 exch dup length string .type1decrypt exch pop
     dup length lenIV sub lenIV exch getinterval
   } if
   0 () /SubFileDecode filter
   mark exch charstack_read csbegin
   counttomark 1 sub -1 0 { index char1 } for
   cleartomark restore
 } bind def

/printfont
 { pcs_ps_dict
   /CSFormat where { pop CSFormat /C eq { pop pcs_c_dict } if } if
   begin
   currentfont begin Private begin 10 dict begin

	% Print the CharStrings and Subrs

   beginchars
   CharStrings { exch charbegin printcs } forall
   endchars
   /Subrs where
    { pop	% the dictionary
      beginsubrs
      0 1 Subrs length 1 sub
       { dup subrbegin
         Subrs exch get printcs
       } for
      endsubrs
    } if

	% Print the bounding boxes

   gsave nulldevice FontMatrix matrix invertmatrix concat
   beginboxes
   0 1 Encoding length 1 sub
    { dup Encoding exch get dup /.notdef eq
       { pop pop notdefbox
       }
       { 1 index boxbegin charname ,
         ( ) dup 0 4 -1 roll put
         newpath 0 0 moveto false charpath
	 pathbbox ({) print 4 -1 roll =only ,
	 3 -1 roll =only , exch =only , =only (}) print
         boxend
       }
      ifelse
    } for
   endboxes
   grestore

   end end end end
 } bind def
 n"n0) h l* n"n0) h l n0h  ` n0( H`& n"n0) h l n0h  ` n0(  n1@  n"n0) 
h o* n"n0) 
h o n0h 
 ` n0( H`& n"n0) h o n0h  ` n0(  n1@  n"n0) h o* n"n0) h o n0h  ` n0( H`& n"n0) h o n0h  ` n0(  n1@ /,`N l ^fJ,^vgHl^`Hl^/,` n "n -i d-i "h=i &lHPHnd?< ACd  0 n "n -i (d-i ,h=i 0lHh 
Hnd?< ACd  0 n "n -i 2d-i 6h=i :lHh Hnd?< %    Copyright (C) 1994, 1995, 1996, 1997, 1998 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf2dsc.ps,v 1.3.4.2 2002/02/22 19:45:55 ray Exp $
% pdf2dsc.ps
% read pdf file and produce DSC "index" file.
%
% Input  file is named PDFname
% Output file is named DSCname
%
% Run using:
%  gs -dNODISPLAY -sPDFname=pdffilename -sDSCname=tempfilename pdf2dsc.ps
% Then display the PDF file with
%  gs tempfilename
%
% Modified by Geoff Keating <geoffk@ozemail.com.au> 21/12/98:
%	Add DocumentMedia, PageMedia comments
%	Use inherited BoundingBox and Orientation
%	Reformat, add new macro 'puts', generally clean up
% Modified by Johannes Plass <plass@dipmza.physik.uni-mainz.de> 1996-11-05:
%	Adds BoundingBox and Orientation if available.
% Modified by rjl/lpd 9/19/96
%	Updates for compatibility with modified pdf_*.ps code for handling
%	  page ranges (i.e., partial files) better.
% Modified by Geoff Keating <Geoff.Keating@anu.edu.au> 7/3/96:
%	include Title and CreationDate DSC comments (these are displayed by
%	  Ghostview);
%	reduce the size of typical output files by a factor of about 3.
% Modified by L. Peter Deutsch 3/18/96:
%	Removes unnecessary and error-prone code duplicated from pdf_main.ps
% Modified by L. Peter Deutsch for GS 3.33
% Originally by Russell Lang  1995-04-26

/PDFfile PDFname (r) file def
/DSCfile DSCname (w) file def
systemdict /.setsafe known { .setsafe } if

/puts { DSCfile exch writestring } bind def
/DSCstring 255 string def
/MediaTypes 10 dict def

% (str1) (str2)  concatstr  (str1str2)
/concatstr {
  2 copy length exch length add string
  dup dup 5 2 roll copy length
% stack: newstring newstring str2 str1-length
  exch putinterval
} bind def

   GS_PDF_ProcSet begin
   pdfdict begin
   PDFfile
   pdfopen begin
   /FirstPage where { pop } { /FirstPage 1 def } ifelse
   /LastPage where { pop } { /LastPage pdfpagecount def } ifelse

% scan through for media sizes, keep them in the dictionary
   FirstPage 1 LastPage {
      pdfgetpage /MediaBox pget pop   % MediaBox is a required attribute
      aload pop 
      3 -1 roll sub 3 1 roll exch sub exch
      2 array astore 
      aload 3 1 roll 10 string cvs exch 10 string cvs
      (x) exch concatstr concatstr cvn
      MediaTypes 3 1 roll exch put
   } for

% write header and prolog
   (%!PS-Adobe-3.0\n) puts
   Trailer /Info knownoget
    {
      dup /Title knownoget
       {
         (%%Title: ) puts
         DSCfile exch write==
       }
      if
      /CreationDate knownoget
       {
         (%%CreationDate: ) puts
         DSCfile exch write==
       }
      if
    }
   if
   % This is really supposed to be sorted by frequency of usage...
   (%%DocumentMedia: )
   MediaTypes { 
      exch pop
      1 index puts
      (y) puts dup 1 get DSCstring cvs puts
      (x) puts dup 0 get DSCstring cvs puts 
      ( ) puts dup 0 get DSCstring cvs puts
      ( ) puts 1 get DSCstring cvs puts 
      ( 70 white ()\n) puts
      pop (%%+ )
   } forall
   pop

   (%%Pages: ) puts
   LastPage FirstPage sub 1 add DSCstring cvs puts
   (\n%%EndComments\n) puts
   (%%BeginProlog\n) puts
   (/Page null def\n/Page# 0 def\n/PDFSave null def\n) puts
   (/DSCPageCount 0 def\n) puts
   (/DoPDFPage {dup /Page# exch store pdfgetpage pdfshowpage } def\n) puts
   (GS_PDF_ProcSet begin\npdfdict begin\n) puts
   (%%EndProlog\n) puts
   (%%BeginSetup\n) puts
   DSCfile PDFname write==only
   ( \(r\) file pdfopen begin\n) puts
   (%%EndSetup\n) puts
   % process each page
   FirstPage 1 LastPage {
       (%%Page: ) puts
       dup DSCstring cvs puts
       ( ) puts
       dup DSCstring cvs puts
       (\n) puts

       dup pdfgetpage
       dup /MediaBox pget pop
         (%%PageMedia: y) puts
	 aload pop 3 -1 roll sub DSCstring cvs puts
	 (x) puts exch sub DSCstring cvs puts
	 (\n) puts
       dup /CropBox pget {
         (%%PageBoundingBox: ) puts
         {DSCfile exch write=only ( ) puts} forall
         (\n) puts
       } if
       /Rotate pget {
         (%%PageOrientation: ) puts
         90 div cvi 4 mod dup 0 lt {4 add} if
         [(Portrait) (Landscape) (UpsideDown) (Seascape)] exch get puts
         (\n) puts
       } if

       DSCfile exch DSCstring cvs writestring
       ( DoPDFPage\n) puts
    } for
   currentdict pdfclose
   end
   end
   end
% write trailer
(%%Trailer\n) puts
(currentdict pdfclose\nend\nend\nend\n) puts
(%%EOF\n) puts
% close output file and exit
DSCfile closefile
quit
% end of pdf2dsc.ps
 0N^NuCOS     NV  Hn ?<  n C   0N^NuSIN     NV  Hlo?< Hn ?<                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %    Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf_base.ps,v 1.14.2.1 2002/02/22 19:45:55 ray Exp $
% pdf_base.ps
% Basic parser for PDF reader.

% This handles basic parsing of the file (including the trailer
% and cross-reference table), as well as objects, object references,
% streams, and name/number trees; it doesn't include any facilities for
% making marks on the page.

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal
/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
pdfdict begin

% Define the name interpretation dictionary for reading values.
/valueopdict mark
  (<<) cvn { mark } bind	% don't push an actual mark!
  (>>) cvn /.dicttomark load
  ([) cvn { mark } bind		% ditto
  (]) cvn dup load
%  /true true		% see .pdfexectoken below
%  /false false		% ibid.
%  /null null		% ibid.
  /F dup cvx		% see Objects section below
  /R dup cvx		% see Objects section below
  /stream dup cvx	% see Streams section below
.dicttomark readonly def

% ------ Utilities ------ %

% Define a scratch string.  The PDF language definition says that
% no line in a PDF file can exceed 255 characters.
/pdfstring 255 string def

% Read the previous line of a file.  If we aren't at a line boundary,
% read the line containing the current position.
% Skip any blank lines.
/prevline		% - prevline <startpos> <substring>
 { PDFfile fileposition dup () pdfstring
   2 index 257 sub 0 .max PDFfile exch setfileposition
    {		% Stack: initpos linepos line string
      PDFfile fileposition
      PDFfile 2 index readline pop
      dup length 0 gt
       { 3 2 roll 5 -2 roll pop pop 2 index }
       { pop }
      ifelse
		% Stack: initpos linepos line string startpos
      PDFfile fileposition 5 index ge { exit } if
      pop
    }
   loop pop pop 3 -1 roll pop
 } bind def

% Handle the PDF 1.2 #nn escape convention when reading from a file.
% This should eventually be done in C.
/.pdffixname {			% <execname> .pdffixname <execname'>
  PDFversion 1.2 ge {
    dup .namestring (#) search {
      name#escape cvn exch pop
    } {
      pop
    } ifelse
  } if
} bind def
/name#escape			% <post> <(#)> <pre> name#escape <string>
{ exch pop
  1 index 2 () /SubFileDecode filter dup (x) readhexstring
		% Stack: post pre stream char t/f
  not { /.pdftoken cvx /syntaxerror signalerror } if
  exch closefile concatstrings
  exch 2 1 index length 2 sub getinterval
  (#) search { name#escape } if concatstrings
} bind def

% Execute a file, interpreting its executable names in a given
% dictionary.  The name procedures may do whatever they want
% to the operand stack.
/.pdftokenerror {		% <count> <opdict> <errtoken> .pdftokenerror -
  BXlevel 0 le {
    (%stderr) (w) file
    dup (****************Unknown operator: ) writestring
    dup 2 index .writecvs dup (\n) writestring flushfile
  } if pop pop
  count exch sub { pop } repeat	% pop all the operands
} bind def
/.pdfexectoken {		% <count> <opdict> <exectoken> .pdfexectoken ?
  DEBUG { dup == flush } if
  2 copy .knownget {
    exch pop exch pop exch pop exec
  } {
		% Normally, true, false, and null would appear in opdict
		% and be treated as "operators".  However, there is a
		% special fast case in the PostScript interpreter for names
		% that are defined in, and only in, systemdict and/or
		% userdict: putting these three names in the PDF dictionaries
		% destroys this property for them, slowing down their
		% interpretation in all PostScript code.  Therefore, we
		% check for them explicitly here instead.
    dup dup dup /true eq exch /false eq or exch /null eq or {
      exch pop exch pop //systemdict exch get
    } {
      .pdftokenerror
    } ifelse
  } ifelse
} bind def
/.pdfrun {			% <file> <opdict> .pdfrun -
	% Construct a procedure with the stack depth, file and opdict
	% bound into it.
  1 index cvlit count 2 sub 3 1 roll mark mark 5 2 roll
  {	% Stack: ..operands.. count opdict file
    token {
      dup type /nametype eq {
	dup xcheck {
	  .pdfexectoken
	} {
	  .pdffixname
	  exch pop exch pop DEBUG { dup ==only ( ) print flush } if
	} ifelse
      } {
	exch pop exch pop DEBUG { dup ==only ( ) print flush } if
      } ifelse
    } {
      (%%EOF) cvn cvx .pdfexectoken
    } ifelse
  }
  aload pop .packtomark cvx
  /loop cvx 2 packedarray cvx
  { stopped /PDFsource } aload pop
  PDFsource
  { store { stop } if } aload pop .packtomark cvx
  /PDFsource 3 -1 roll store exec
} bind def

% Execute a file, like .pdfrun, for a marking context.
% This temporarily rebinds LocalResources and DefaultMatrix.
/.pdfruncontext {		% <resdict> <file> <opdict> .pdfruncontext -
  /.pdfrun load LocalResources DefaultMatrix
  /LocalResources 7 -1 roll store
  /DefaultMatrix matrix currentmatrix store
  3 .execn
  /DefaultMatrix exch store
  /LocalResources exch store
} bind def

% Get the depth of the PDF operand stack.  The main program (pdf_main.ps)
% sets pdfemptycount before calling .pdfrun.
/.pdfcount {		% - .pdfcount <count>
  count pdfemptycount sub
} bind def

% ------ File reading ------ %

% Read the cross-reference entry for an (unresolved) object.
% The caller must save and restore the PDFfile position if desired.
% For invalid (free) objects, we return 0.
/readxrefentry		% <object#> readxrefentry <objpos>
 { dup Objects exch lget
   PDFfile exch setfileposition
   PDFfile token pop		% object position
   PDFfile token pop		% generation #
   PDFfile token pop		% n or f
   dup /n eq
    { pop 1 add dup 255 gt
       { Generations ltype /stringtype eq
	  {		% Convert Generations from a string to an array.
	    larray Generations llength lgrowto dup
	    0 1 2 index llength 1 sub
	     { Generations 1 index lget lput dup
	     }
	    for pop /Generations exch store
	  }
	 if
       }
      if
    }
    { /f eq
       { pop 0 }
       { /readxrefentry cvx /syntaxerror signalerror }
      ifelse
    }
   ifelse
		% Stack: obj# objpos 1+gen#
   Generations 4 -1 roll 3 -1 roll lput
 } bind def

% ================================ Objects ================================ %

% Since we may have more than 64K objects, we have to use a 2-D array to
% hold them (and the parallel Generations structure).
/lshift 9 def
/lnshift lshift neg def
/lsubmask 1 lshift bitshift 1 sub def
/lsublen lsubmask 1 add def
/larray {	% - larray <larray>
  [ [] ]
} bind def
/lstring {	% - lstring <lstring>
  [ () ]
} bind def
/ltype {	% <lseq> type <type>
  0 get type
} bind def
/lget {		% <lseq> <index> lget <value>
  dup //lsubmask and 3 1 roll //lnshift bitshift get exch get
} bind def
/lput {		% <lseq> <index> <value> lput -
  3 1 roll
  dup //lsubmask and 4 1 roll //lnshift bitshift get
  3 1 roll put
} bind def
/llength {	% <lseq> llength <length>
  dup length 1 sub dup //lshift bitshift
  3 1 roll get length add
} bind def
% lgrowto assumes newlength > llength(lseq)
/growto {	% <string/array> <length> growto <string'/array'>
  1 index type /stringtype eq { string } { array } ifelse
  2 copy copy pop exch pop
} bind def
/lgrowto {	% <lseq> <newlength> lgrowto <lseq'>
    dup //lsubmask add //lnshift bitshift dup 3 index length gt {
	% Add more sub-arrays.  Start by completing the last existing one.
		% Stack: lseq newlen newtoplen
    3 -1 roll dup llength 1 sub //lsubmask or 1 add lgrowto
		% Stack: newlen newtoplen lseq
    [ exch aload pop
    counttomark 2 add -1 roll		% newtoplen
    counttomark sub { dup 0 0 getinterval lsublen growto } repeat
    dup 0 0 getinterval ] exch
  } {
    pop
  } ifelse
	% Expand the last sub-array.
  1 sub //lsubmask and 1 add
  exch dup dup length 1 sub 2 copy
		% Stack: newsublen lseq lseq len-1 lseq len-1
  get 5 -1 roll growto put
} bind def
/lforall {	% <lseq> <proc> lforall -
  /forall cvx 2 packedarray cvx forall
} bind def

% We keep track of PDF objects using the following PostScript variables:
%
%	Generations (lstring): Generations[N] holds 1+ the current
%	    generation number for object number N.  (As far as we can tell,
%	    this is needed only for error checking.)  For free objects,
%	    Generations[N] is 0.
%
%	Objects (larray): If object N is loaded, Objects[N] is the actual
%	    object; otherwise, Objects[N] is an executable integer giving
%	    the file offset of the object's entry in the cross-reference
%	    table.
%
%	GlobalObjects (dictionary): If object N has been resolved in
%	    global VM, GlobalObjects[N] is the same as Objects[N]
%	    (except that GlobalObjects itself is stored in global VM,
%	    so the entry will not be deleted at the end of the page).
%
%	IsGlobal (lstring): IsGlobal[N] = 1 iff object N was resolved in
%	    global VM.  This is an accelerator to avoid having to do a
%	    dictionary lookup in GlobalObjects when resolving every object.

% Initialize the PDF object tables.
/initPDFobjects {		% - initPDFobjects -
  /Objects larray def
  /Generations lstring def
  .currentglobal true .setglobal
  /GlobalObjects 20 dict def
  .setglobal
  /IsGlobal lstring def
} bind def

% Grow the tables to a specified size.
/growPDFobjects {		% <minsize> growPDFobjects -
  dup Objects llength gt {
    dup Objects exch lgrowto /Objects exch def
  } if
  dup Generations llength gt {
    dup Generations exch lgrowto /Generations exch def
  } if
  dup IsGlobal llength gt {
    dup IsGlobal exch lgrowto /IsGlobal exch def
  } if
  pop
} bind def

% We represent an unresolved object reference by a procedure of the form
% {obj# gen# resolveR}.  This is not a possible PDF object, because PDF has
% no way to represent procedures.  Since PDF in fact has no way to represent
% any PostScript object that doesn't evaluate to itself, we can 'force'
% a possibly indirect object painlessly with 'exec'.
% Note that since we represent streams by executable dictionaries
% (see below), we need both an xcheck and a type check to determine
% whether an object has been resolved.
/resolved? {		% <object#> resolved? <value> true
			% <object#> resolved? false
  Objects 1 index lget dup xcheck {
    dup type /integertype eq {
		% Check whether the object is in GlobalObjects.
      pop IsGlobal 1 index lget 0 eq {
	pop false
      } {
		% Update Objects from GlobalObjects
	DEBUG { (%Global=>local: ) print dup == } if
	GlobalObjects 1 index get dup Objects 4 1 roll lput true
      } ifelse
    } {
      exch pop true
    } ifelse
  } {
    exch pop true
  } ifelse
} bind def
/oforce /exec load def
/oget {		% <array> <index> oget <object>
		% <dict> <key> oget <object>
		% Before release 6.20, this procedure stored the resolved
		% object back into the referring slot.  In order to support
		% PDF linearization, we no longer do this.
  get oforce
} bind def
% A null value in a dictionary is equivalent to an omitted key;
% we must check for this specially.
/knownoget {	% <dict> <key> knownoget <value> true
		% <dict> <key> knownoget false
		% See oget above regarding this procedure.
  .knownget {
    oforce dup null eq { pop false } { true } ifelse
  } {
    false
  } ifelse
} bind def

% PDF 1.1 defines a 'foreign file reference', but not its meaning.
% Per the specification, we convert these to nulls.
/F {		% <file#> <object#> <generation#> F <object>
		% Some PDF 1.1 files use F as a synonym for f!
   .pdfcount 3 lt { f } { pop pop pop null } ifelse
} bind def

/checkgeneration {  % <object#> <generation#> checkgeneration <object#> <OK>
  Generations 2 index lget 1 sub 1 index eq {
    pop true
  } {
    QUIET not {
      Generations 2 index lget 0 eq {
	(Warning: reference to free object: )
      } {
	(Warning: wrong generation: )
      } ifelse print 1 index =only ( ) print =only ( R) =
    } {
      pop
    } ifelse false
  } ifelse
} bind def
/R {		% <object#> <generation#> R <object>
  /resolveR cvx 3 packedarray cvx
} bind def

% If we encounter an object definition while reading sequentially,
% we just store it away and keep going.
/objopdict mark
  valueopdict { } forall
  /endobj dup cvx
.dicttomark readonly def
/obj {			% <object#> <generation#> obj <object>
  PDFfile objopdict .pdfrun
} bind def
/endobj {		% <object#> <generation#> <object> endobj <object>
  3 1 roll
		% Read the xref entry if we haven't yet done so.
		% This is only needed for generation # checking.
  1 index resolved? {
    pop
  } {
    PDFfile fileposition
    2 index readxrefentry pop
    PDFoffset add PDFfile exch setfileposition
  } ifelse
  checkgeneration {
		% The only global objects we bother to save are
		% (resource) dictionaries.
    1 index dup gcheck exch type /dicttype eq and {
      DEBUG { (%Local=>global: ) print dup == } if
      GlobalObjects 1 index 3 index put
      IsGlobal 1 index 1 put
    } if
    Objects exch 2 index lput
  } {
    pop pop null
  } ifelse
} bind def

% When resolving an object reference, we stop at the endobj.
/resolveopdict mark
  valueopdict { } forall
  /endobj { endobj exit } bind
                % OmniForm generates PDF file with endobj missing in some
                % objects. AR ignores this. So we have to do it too.
  /obj { pop pop endobj exit } bind
.dicttomark readonly def
/resolveR {		% <object#> <generation#> resolveR <object>
  DEBUG { (%Resolving: ) print 2 copy 2 array astore == } if
  1 index resolved? {
    exch pop exch pop
  } {
    PDFfile fileposition 3 1 roll
    1 index readxrefentry
    3 1 roll checkgeneration {
			% Stack: savepos objpos obj#
	 exch PDFoffset add PDFfile exch setfileposition
	 PDFfile token pop 2 copy ne
	  { (xref error!) = /resolveR cvx /rangecheck signalerror
	  }
	 if pop PDFfile token pop
	 PDFfile token pop /obj ne
	  { (xref error!) = /resolveR cvx /rangecheck signalerror
	  }
	 if
	 pdf_run_resolve	% PDFfile resolveopdict .pdfrun
    }
    {		% Don't cache if the generation # is wrong.
	 pop pop null
    } ifelse
    exch PDFfile exch setfileposition
  } ifelse
} bind def      

% ================================ Streams ================================ %

% We represent a stream by an executable dictionary that contains,
% in addition to the contents of the original stream dictionary:
%	/File - the file or string where the stream contents are stored,
%	  if the stream is not an external one.
%	/FilePosition - iff File is a file, the position in the file
%	  where the contents start.
%	/StreamKey - the key used to decrypt this stream, if any.
% We do the real work of constructing the data stream only when the
% contents are needed.

% Construct a stream.  The length is not reliable in the face of
% different end-of-line conventions, but it's all we've got.
%
% PDF files are inconsistent about what may fall between the 'stream' keyword
% and the actual stream data, and it appears that no one algorithm can
% detect this reliably.  We used to try to guess whether the file included
% extraneous \r and/or \n characters, but we no longer attempt to do so,
% especially since the PDF 1.2 specification states flatly that the only
% legal terminators following the 'stream' keyword are \n or \r\n, both of
% which are properly skipped and discarded by the token operator.
/stream {	% <dict> stream <modified_dict>
  dup /F known dup PDFsource PDFfile eq or {
    not {
      dup /File PDFfile put
      dup /FilePosition PDFfile fileposition put
      DEBUG { (%FilePosition: ) print dup /FilePosition get == } if
    } if
    PDFfile fileposition 1 index /Length oget add
      PDFfile exch setfileposition
  } {
    pop
	% We're already reading from a stream, which we can't reposition.
	% Capture the sub-stream contents in a string.
    dup /Length oget string PDFsource exch readstring
    not {
      (Unexpected EOF in stream!) =
      /stream cvx /rangecheck signalerror
    } if
    1 index exch /File exch put
  } ifelse
  PDFsource token pop
    /endstream ne { /stream cvx /syntaxerror signalerror } if
  cvx
} bind def
/endstream {
  exit
} bind def

% Contrary to the published PDF (1.3) specification, Acrobat Reader
% accepts abbreviated filter names everywhere, not just for in-line images,
% and some applications (notably htmldoc) rely on this.
/unabbrevfilterdict mark
  /AHx /ASCIIHexDecode  /A85 /ASCII85Decode  /CCF /CCITTFaxDecode
  /DCT /DCTDecode  /Fl /FlateDecode  /LZW /LZWDecode  /RL /RunLengthDecode
.dicttomark readonly def

% Extract and apply filters.
/filterparms {		% <dict> <DPkey> <Fkey> filterparms
			%   <dict> <parms> <filternames>
  2 index exch .knownget {
    exch 2 index exch .knownget {
		% Both filters and parameters.
      exch dup type /nametype eq {
	1 array astore exch 1 array astore exch
      } if
    } {
		% Filters, but no parameters.
      null exch
      dup type /nametype eq { 1 array astore } if
    } ifelse
  } {
		% No filters: ignore parameters, if any.
    pop null { }
  } ifelse
} bind def
/filtername {		% <filtername> filtername <filtername'>
  //unabbrevfilterdict 1 index .knownget { exch pop } if
} bind def
/applyfilters {		% <parms> <source> <filternames> applyfilters <stream>
  2 index null eq {
    { filtername filter }
  } {
    {		% Stack: parms stream filtername
      2 index 0 oget dup null eq { pop } { exch } ifelse filtername filter
      exch dup length 1 sub 1 exch getinterval exch
    }
  } ifelse forall exch pop
} bind def

% Resolve a stream dictionary to a PostScript stream.
% Streams with no filters require special handling:
%	- If we are going to interpret their contents, we let endstream
%	  terminate the interpretation loop;
%	- If we are just going to read data from them, we impose
%	  a SubFileDecode filter that reads just the requisite amount of data.
% Note that, in general, resolving a stream repositions PDFfile.
% Clients must save and restore the position of PDFfile themselves.
/resolvestream {	% <streamdict> <readdata?> resolvestream <stream>
  1 index /F .knownget {
		% This stream is stored on an external file.
    (r) file 3 -1 roll
    /FDecodeParms /FFilter filterparms
		% Stack: readdata? file dict parms filternames
    4 -1 roll exch
    pdf_decrypt_stream
    applyfilters
  } {
    exch dup /FilePosition .knownget {
      1 index /File get exch setfileposition
    } if
		% Stack: readdata? dict
    /DecodeParms /Filter filterparms
		% Stack: readdata? dict parms filternames
    2 index /File get exch
		% Stack: readdata? dict parms file/string filternames
    pdf_decrypt_stream		% add decryption if needed
    dup length 0 eq {
		% All the PDF filters have EOD markers, but in this case
		% there is no specified filter.
      pop exch pop
		% Stack: readdata? dict file/string
      2 index {
		% We're going to read data; use a SubFileDecode filter.
	1 index /Length oget () /SubFileDecode filter
      } {
	dup type /filetype ne {
		% Use a SubFileDecode filter to read from a string.
	  0 () /SubFileDecode filter
	} if
      } ifelse
    } {
      applyfilters
    } ifelse
  } ifelse
		% Stack: readdata? dict file
  exch pop exch pop
} bind def

% ============================ Name/number trees ============================ %

/nameoget {		% <nametree> <key> nameoget <obj|null>
  exch /Names exch .treeget
} bind def

/numoget {		% <numtree> <key> numoget <obj|null>
  exch /Nums exch .treeget
} bind def

/.treeget {		% <key> <leafkey> <tree> .treeget <obj|null>
  dup /Kids knownoget {
    exch pop .branchget
  } {
    exch get .leafget
  } ifelse
} bind def

/.branchget {		%  <key> <leafkey> <kids> .branchget <obj|null>
  dup length 0 eq {
    pop pop pop null
  } {
    dup length -1 bitshift 2 copy oget
			% Stack: key leafkey kids mid kids[mid]
    dup /Limits oget aload pop
			% Stack: key leafkey kids mid kids[mid] min max
    6 index lt {
      pop pop
      1 add 1 index length 1 index sub getinterval .branchget
    } {
      5 index gt {
	pop
	0 exch getinterval .branchget
      } {
	exch pop exch pop .treeget
      } ifelse
    } ifelse
  } ifelse
} bind def

/.leafget {		% <key> <pairs> .leafget <obj|null>
  dup length 2 eq {
    dup 0 get 2 index eq { 1 oget } { pop null } ifelse
    exch pop
  } {
    dup length -1 bitshift -2 and 2 copy oget
			% Stack: key pairs mid pairs[mid]
    3 index gt { 0 exch } { 1 index length 1 index sub } ifelse
    getinterval .leafget
  } ifelse
} bind def

end			% pdfdict
.setglobal
 S0(2"LH/)PLN^NuPearls.Squares   NVH0&n p  SШ$@Jj f Jj o ?< &/<  /,PLz-j -j >* ,RFHƍ Hƍ HF8.n&HÇ  H r@npFn H nn/,PHHn/,PH/,PP/,PH/,PHy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf_draw.ps,v 1.36.2.1 2002/02/22 19:45:55 ray Exp $
% pdf_draw.ps
% PDF drawing operations (graphics, text, and images).

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal
/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
GS_PDF_ProcSet begin
pdfdict begin

% For simplicity, we use a single interpretation dictionary for all
% PDF graphics operations, even though this is too liberal.
/drawopdict 100 dict def

% ================================ Graphics ================================ %

% ---------------- Functions ---------------- %

% Note that resolvefunction converts a PDF Function to a PostScript Function;
% resolve*fnproc converts a PDF function to a PostScript procedure.

/fnrdict mark
  0 { .resolvefn0 }
  2 { }
  3 { .resolvefn3 }
  4 { .resolvefn4 }
.dicttomark readonly def

/.resolvefn0 {
		% Don't lose our place in PDFfile.
  PDFfile fileposition exch
  dup true resolvestream
		% The stream isn't positionable, so read all the data now.
		% Stack: filepos fndict stream
  1 index /Range oget length 2 idiv 2 index /BitsPerSample oget mul
  2 index /Size oget { mul } forall
  7 add 8 idiv string
  1 index exch readstring pop exch closefile
		% Stack: filepos fndict data
  exch dup length 1 add dict .copydict
  dup /DataSource 4 -1 roll put
  exch PDFfile exch setfileposition
} bdef

/.resolvefn3 {
  dup length dict .copydict
  dup /Bounds 2 copy knownoget { put } { pop pop } ifelse
  dup /Encode 2 copy knownoget { put } { pop pop } ifelse
  dup /Functions 2 copy oget mark exch dup {
    oforce .resolvefn
  } forall
  counttomark -1 roll astore exch pop put
} bdef

/.resolvefn4 {
  PDFfile fileposition exch             % filepos fndict
  dup true resolvestream                % filepos fndict stream
  exch dup length dict copy             % filepos stream fndict2
  dup /Function undef                   % filepos stream fndict2
  exch dup token not {
    () /rangecheck cvx signalerror
  } if
  exch token {
    /rangecheck cvx signalerror
  } if
		% Use .bind to avoid idiom recognition.
  .bind
  1 index /Function 3 -1 roll put
  exch PDFfile exch setfileposition
} bdef
currentdict /tfopdict undef

/.resolvefn {		% <fndict> .resolvefn <fndict'>
  dup /FunctionType oget //fnrdict exch get exec
} bdef

/resolvefunction {	% <fndict> resolvefunction <function>
  .resolvefn
  DEBUG { (%Function: ) print dup === flush } if
} bdef

/resolvefnproc {	% <fndict> resolvefnproc <proc>
  resolvefunction .buildfunction
} bdef

/resolveidfnproc {	% <fndict> resolveidfnproc <proc>
  dup /Identity eq { pop { } } { resolvefnproc } ifelse
} bdef

/resolvedefaultfnproc {	% <fndict> <default> resolved'fnproc <proc>
  1 index /Default eq { exch pop } { pop resolveidfnproc } ifelse
} bdef

% ---------------- Shadings ---------------- %

/shrdict mark
  /ColorSpace {
    resolvecolorspace
  }
  /Function {
    dup type /dicttype eq {
      resolvefunction
    } {
      [ exch { oforce resolvefunction } forall ]
    } ifelse
  }
.dicttomark readonly def

/resolveshading {	% <shadingstream> resolveshading <shading>
  PDFfile fileposition exch
  mark exch {
    oforce //shrdict 2 index .knownget { exec } if
  } forall .dicttomark
  dup /ShadingType get 4 ge {
    dup dup true resolvestream
		% Make a reusable stream so that the shading doesn't
		% reposition PDFfile at unexpected times.
    /ReusableStreamDecode filter /DataSource exch put
  } if exch PDFfile exch setfileposition
} bdef
/resolvesh {		% <shname> resolveshading <shading>
  Page /Shading rget {
    resolveshading
  } {
    null
  }ifelse
} bdef

% ---------------- Halftones ---------------- %

/spotfunctions mark
  /Round {
    abs exch abs 2 copy add 1 le {
      dup mul exch dup mul add 1 exch sub 
    } {
      1 sub dup mul exch 1 sub dup mul add 1 sub
    } ifelse
  }
  /Diamond {
    abs exch abs 2 copy add .75 le {
      dup mul exch dup mul add 1 exch sub
    } {
      2 copy add 1.23 le {
	.85 mul add 1 exch sub
      } {
	1 sub dup mul exch 1 sub dup mul add 1 sub
      } ifelse
    } ifelse
  }
  /Ellipse {
    abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt {
      pop dup mul exch .75 div dup mul add 4 div 1 exch sub
    } {
      dup 1 gt {
	pop 1 exch sub dup mul exch 1 exch sub
	.75 div dup mul add 4 div 1 sub
      } {
	.5 exch sub exch pop exch pop
      } ifelse
    } ifelse
  }
  /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub }
  /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub }
  /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub }
  /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub }
  /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub }
  /Line { exch pop abs neg }
  /LineX { pop }
  /LineY { exch pop }
  /Square { abs exch abs 2 copy lt { exch } if pop neg }
  /Cross { abs exch abs 2 copy gt { exch } if pop neg }
  /Rhomboid { abs exch abs 0.9 mul add 2 div }
  /DoubleDot { 2 {360 mul sin 2 div exch } repeat add }
  /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg }
  /SimpleDot { dup mul exch dup mul add 1 exch sub }
  /InvertedSimpleDot { dup mul exch dup mul add 1 sub }
  /CosineDot { 180 mul cos exch 180 mul cos add 2 div }
  /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add }
  /InvertedDouble {
    exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg
  }
.dicttomark readonly def

/htrdict mark
  1 { .resolveht1 }
  5 { .resolveht5 }
	% We don't support types 6, 10, or 16 yet.
.dicttomark readonly def

/.resolveht1 {
  mark exch {
    oforce
    1 index /SpotFunction eq {
      dup type /nametype eq
	{ //spotfunctions exch get } { resolvefnproc }
      ifelse
    } {
      1 index /TransferFunction eq {
	resolveidfnproc
      } if
    } ifelse
  } forall .dicttomark
} bdef

/.resolveht5 {
  mark exch {
    oforce dup type /dicttype eq { resolvehalftone } if
  } forall .dicttomark
} bdef

/resolvehalftone {	% <dict> resolvehalftone <halftone>
  dup /HalftoneType get //htrdict exch get exec
} bdef

% ---------------- Graphics state management ---------------- %

/cmmatrix matrix def
drawopdict begin
			% Graphics state stack
  /q { q } def
  /Q { Q } def
			% Graphics state setting
  /cm { //cmmatrix astore concat } def
  /i /setflat load def
  /J /setlinecap load def
  /d /setdash load def
  /j /setlinejoin load def
  /w /setlinewidth load def
  /M /setmiterlimit load def
  /gs { gs } def
end

% Each entry in this dictionary is
%	<gsres> <value> -proc- <gsres>
/gsbg {
  /BGDefault load resolvedefaultfnproc setblackgeneration
} bdef
/gsucr {
  /UCRDefault load resolvedefaultfnproc setundercolorremoval
} bdef
/gstr {
  dup type /arraytype eq {
    { oforce /TRDefault load resolvedefaultfnproc } forall
    setcolortransfer
  } {
    /TRDefault load resolvedefaultfnproc settransfer
  } ifelse
} bdef
/gsparamdict mark
  /SA { setstrokeadjust }
  /OP { 1 index /op known not { dup op } if OP }
	% The PDF 1.3 specification says that the name /Default is only
	% recognized for {BG,UCR,TR}2.  However, PDF 1.3 files produced
	% by Adobe Acrobat Distiller 4.0 for Windows use the name /Default
	% with the older keys, so we have to implement this.
  /BG { 1 index /BG2 known { pop } { gsbg } ifelse }
  /UCR { 1 index /UCR2 known { pop } { gsucr } ifelse }
  /TR { 1 index /TR2 known { pop } { gstr } ifelse }
  /HT {
    dup /Default eq {
      pop .setdefaultscreen
    } {
	%****** DOESN'T IMPLEMENT THE STREAM CASE YET ******
      resolvehalftone sethalftone
    } ifelse
  }
  /HTP {
	% HTP may be present even if this isn't a DPS interpreter.
    /sethalftonephase where { pop aload pop sethalftonephase } { pop } ifelse
  }
	% PDF 1.3
  /Font { aload pop Tf }
  /LW { setlinewidth }
  /LC { setlinecap }
  /LJ { setlinejoin }
  /ML { setmiterlimit }
  /D { aload pop setdash }
  /RI { ri }
  /op { op }
  /OPM { OPM }
  /BG2 { gsbg }
  /UCR2 { gsucr }
  /TR2 { gstr }
  /FL { setflat }
  /SM {
	% SM may be present even if this is only a Level 2 interpreter.
    /setsmoothness where { pop setsmoothness } { pop } ifelse
  }
	% PDF 1.4
	% All of these require the "transparency" feature in the interpreter.
  /ca { ca }
  /CA { CA }
  /SMask { gssmask }
  /AIS { AIS }
  /BM { BM }
  /TK { TK }
.dicttomark readonly def
/gs {			% <gsres> gs -
  Page /ExtGState rget {
	% We keep the dictionary on the stack during the forall so that
	% keys that interact with each other have access to it.
    dup {
      oforce exch gsparamdict exch .knownget { exec } { pop } ifelse
    } forall pop
  } if
} bdef

% ------ Transparency support ------ %

/gssmask {
  dup /None eq {
    pop null
  } {
	% Preprocess the SMask value into a parameter dictionary for
	% .begintransparencymask, with added /BBox and /Draw keys.
    mark exch		% Stack: mark smaskdict
    dup /S oget /Subtype exch 3 2 roll
			% Stack: mark ... smaskdict
    dup /BC knownoget { /Background exch 3 2 roll } if
    dup /TR knownoget {
      resolveidfnproc /TransferFunction exch 3 2 roll
    } if    
    dup /G oget dup /BBox oget /BBox exch 4 2 roll
    /.execmaskgroup cvx 2 packedarray cvx /Draw exch 3 2 roll
    pop .dicttomark
  } ifelse SMask
} bdef

% This procedure is called to actually render the soft mask.
/.execmaskgroup {	% <masknum> <paramdict> <formdict> .execmaskgroup -
	% Save our place in PDFfile, and do a gsave to avoid resetting
	% the color space.
  gsave PDFfile fileposition 4 1 roll
	% We have to select the group's color space so that the
	% background color will be interpreted correctly.
  dup /Group oget /CS knownoget { csresolve setcolorspace } if
  exch dup /BBox get aload pop .begintransparencymask {
    dup /Resources knownoget { oforce } { 0 dict } ifelse
    exch false resolvestream
    .execgroup .endtransparencymask
  } .internalstopped {
    .discardtransparencymask stop
  } if
  PDFfile exch setfileposition grestore
} bdef
% Paint a Form+Group XObject, either for a transparency mask or for a Do.
/.execgroup {		% <resdict> <stream> .execgroup -
  gsave
  1 .setopacityalpha 1 .setshapealpha
  0 .inittransparencymask 1 .inittransparencymask
  /Compatible .setblendmode
	% Execute the body of the Form, similar to DoForm.
  pdfopdict .pdfruncontext
  grestore
} bdef

/.beginformgroup {	% groupdict bbox .beginformgroup -
  exch mark exch			% bbox mark groupdict
  dup /CS knownoget { csresolve setcolorspace } if
  dup /I knownoget { /Isolated exch 3 2 roll } if
  dup /K knownoget { /Knockout exch 3 2 roll } if
  pop .dicttomark
		% Stack: bbox paramdict
  exch aload pop
  .begintransparencygroup
} bdef

% .paintgroupform implements the Form PaintProc in the case where the
% Form XObject dictionary includes a Group key.  See .paintform below.
/.paintgroupform {	% <resdict> <stream> <formdict> .paintgroupform -
  dup /Group oget exch /BBox oget
		% Stack: resdict stream groupdict bbox
  .beginformgroup {
    .execgroup
  } .internalstopped {
    .discardtransparencygroup stop
  } if .endtransparencygroup
} bdef

% Make an ImageType 103 (soft-masked) image.
/makesoftmaskimage {	% <datasource> <imagemask> <SMask> makesoftmaskimage
			%   <datasource> <imagemask>, updates currentdict =
			%   imagedict
		% See the ImageType 3 case of makemaskimage below.
		% SMask is a stream, another Image XObject.
		% Stack: datasource imagemask(false) smaskstreamdict
  PDFfile fileposition exch
  dup /Matte knownoget { /Matte exch def } if
  dup length dict makeimagedict pop
		% In order to prevent the two data sources from being
		% aliased, we need to make at least one a reusable stream.
		% We pick the mask, since it's smaller (in case we need to
		% read all its data now).
		% Stack: datasource imagemask(false) savedpos
		% maskdict is currentdict
  /DataSource DataSource mark
    /Intent 1
    /AsyncRead true
  .dicttomark .reusablestreamdecode def
  PDFfile exch setfileposition
  currentdict end currentdict end
  5 dict begin
  /ImageType 103 def
  /DataDict exch def
  dup /InterleaveType 3 put
  DataDict /Matte .knownget {
    /Matte exch def
  } if
  AlphaIsShape { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def
  /ColorSpace DataDict /ColorSpace get def
} bdef

% ---------------- Color setting ---------------- %

/01_1 [0 1] readonly def
/01_3 [0 1 0 1 0 1] readonly def
/01_4 [0 1 0 1 0 1 0 1] readonly def

% The keys here are resolved (PostScript, not PDF) color space names.
/csncompdict mark
  /DeviceGray { pop 1 }
  /DeviceRGB { pop 3 }
  /DeviceCMYK { pop 4 }
  /CIEBasedA { pop 1 }
  /CIEBasedABC { pop 3 }
  /ICCBased { 1 oget /N oget }
  /Separation { pop 1 }
  /DeviceN { 1 oget length }
.dicttomark readonly def

% Perhaps some of the values in the following need to be modified
% depending on the WhitePoint value....
/cslabinit mark
  /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]
  /MatrixABC [1 1 1 1 0 0 0 0 -1]
  /DecodeLMN [
    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
     0.9505 mul} bind
    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
     } bind
    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse
     1.0890 mul} bind
  ]
.dicttomark readonly def

/csrdict mark
  /DeviceGray {
    /DefaultGray Page /ColorSpace rget { exch pop resolvecolorspace } if
  }
  /DeviceRGB {
    /DefaultRGB Page /ColorSpace rget { exch pop resolvecolorspace } if
  }
  /DeviceCMYK { }
  /CalGray {
    1 oget 6 dict begin
    dup /Gamma knownoget {
      /exp load 2 packedarray cvx /DecodeA exch def
    } if
    dup /BlackPoint knownoget { /BlackPoint exch def } if
    dup /WhitePoint knownoget { /WhitePoint exch def } if
    pop [ /CIEBasedA currentdict end ]
  }
  /CalRGB {
    1 oget 6 dict begin
    dup /Gamma knownoget {
      [ exch { /exp load 2 packedarray cvx } forall
      ] /DecodeABC exch def
    } if
    dup /Matrix knownoget { /MatrixABC exch def } if
    dup /BlackPoint knownoget { /BlackPoint exch def } if
    dup /WhitePoint knownoget { /WhitePoint exch def } if
    pop [ /CIEBasedABC currentdict end ]
  }
  /CalCMYK {
    pop /DeviceCMYK		% not defined by Adobe
  }
  /Lab {
    1 oget 6 dict begin
    dup /Range knownoget not { [-100 100 -100 100] } if
    [0 100 null null null null] dup 2 4 -1 roll putinterval
    /RangeABC exch def
    //cslabinit { def } forall
    dup /BlackPoint knownoget { /BlackPoint exch def } if
    dup /WhitePoint knownoget { /WhitePoint exch def } if
    pop [ /CIEBasedABC currentdict end ]
  }
  /ICCBased {
    PDFfile fileposition exch
    dup dup 1 oget
    mark exch { oforce } forall .dicttomark
    dup dup true resolvestream
    /ReusableStreamDecode filter /DataSource exch put
    1 exch put
    exch PDFfile exch setfileposition
  } bind
  /Separation {
    aload pop exch oforce resolvecolorspace exch oforce resolvefnproc
    4 array astore
  }
  /DeviceN {
    0 4 getinterval                    % ignore attributes
    aload pop 3 -1 roll oforce
    3 -1 roll oforce resolvecolorspace
    3 -1 roll oforce resolvefnproc
    4 array astore
  }
  /Indexed {
    aload pop 3 -1 roll oforce resolvecolorspace
		% If the underlying space is a Lab space, we must scale
		% the output of the lookup table as part of DecodeABC.
    dup dup type /arraytype eq { 0 get } if /CIEBasedABC eq {
      dup 1 get /DecodeLMN known {
	1 get dup length dict copy
	begin /DecodeABC [ 0 2 4 {
	  RangeABC 1 index 1 add get RangeABC 2 index get sub /mul load
	  RangeABC 3 index get /add load
	  DecodeABC 6 -1 roll 2 idiv get [ 6 1 roll aload pop ] cvx
	} for ] def
	/RangeABC //01_3 def
	currentdict end /CIEBasedABC exch 2 array astore
      } if
    } if
    3 1 roll
    oforce dup type /stringtype ne {
		% The color lookup table is a stream.
		% Get its contents.  Don't lose our place in PDFfile.
		% Stack: /Indexed basespace hival lookup
	PDFfile fileposition 5 1 roll true resolvestream
		% Stack: filepos /Indexed basespace hival lookupstream
	1 index 1 add
		% Stack: filepos /Indexed basespace hival lookupstream len
	3 index
	  dup dup type /arraytype eq { 0 get } if
	  //csncompdict exch get exec mul
	string readstring pop
		% Stack: filepos /Indexed basespace hival table
	5 -1 roll PDFfile exch setfileposition
    }
    if 4 array astore
  }
  /Pattern {
    dup type /nametype ne {
      dup length 1 gt {
	1 oget resolvecolorspace
	/Pattern exch 2 array astore
      } if
    } if
  }
.dicttomark readonly def

/cssubst {		% <csname> cssubst <cspace'> true
			% <csname> cssubst false
  dup resolvecolorspace
  dup 1 index ne { exch pop true } { pop pop false } ifelse
} bdef

/csnames mark
  /DeviceGray dup  /DeviceRGB dup  /DeviceCMYK dup  /Pattern dup
.dicttomark readonly def
/csresolve {		% <csresourcename> csresolve <cspace>
  dup Page /ColorSpace rget {
    exch pop resolvecolorspace
  } {
    //csnames 1 index known not { /undefined cvx signalerror } if
  } ifelse
} bdef
/resolvecolorspace {	% <cspace> resolvecolorspace <cspace'>
  dup dup type /arraytype eq { 0 get } if
  //csrdict exch .knownget {
    exec dup type /nametype ne { dup length 1 eq { 0 get } if } if
  } {
    csresolve
  } ifelse
} bdef

/scresolve {	% <c0> ... scresolve <multi>
		% We can't really make sc[n] and SC[N] work, because
		% the color space information isn't available at
		% conversion time; so we hack it by assuming that
		% all the operands on the stack are used, and that
		% if the top operand is a name, it's a Pattern resource.
  dup type /nametype eq
    { Page /Pattern rget { resolvepattern } { null } ifelse }
  if
  dup type /dicttype eq {
		% Check the PaintType, if any (shading patterns don't
		% have one).
    dup /PaintType .knownget { 2 eq } { false } ifelse
  } {
    .pdfcount 1 gt
  } ifelse
} bdef

/.pdfpaintproc {         % <patdict> <resdict> .pdfpaintproc -
  DEBUG { (%Begin PaintProc) = flush } if
	% For uncolored patterns, we have to unbind the current
	% color and color space before running the PaintProc.
	% There's no harm in doing this for colored patterns,
	% so for simplicity, we always do it.
  PDFfile fileposition 3 1 roll
  q
  null sc1 null SC1
  exch false resolvestream pdfopdict .pdfruncontext
  Q
  DEBUG { (%End PaintProc) = flush } if
  PDFfile exch setfileposition
} bdef

/resolvepattern {	% <patternstreamdict> resolvepattern <patterndict>
		% Don't do the resolvestream now: just capture the data
		% from the file if necessary.
  dup length dict copy
  dup /FilePosition .knownget {
    1 index /File get dup fileposition 3 1 roll
		% Stack: dict savepos pos file
    dup 3 -1 roll setfileposition
    dup 3 index /Length oget string readstring pop
		% Stack: dict savepos file string
    3 1 roll exch setfileposition
    1 index /File 3 -1 roll put
    dup /FilePosition undef
  } if
  dup /Shading knownoget {
    resolveshading 1 index /Shading 3 -1 roll put
  } if
  dup /PaintProc [
		% Bind the resource dictionary into the PaintProc.
    2 index /Resources knownoget { oforce } { 0 dict } ifelse
    /.pdfpaintproc cvx
  ] cvx put
  DEBUG {
    (%Pattern: ) print dup === flush
  } if
} bdef

drawopdict begin
  /g { /DeviceGray cssubst { cs sc1 } { g } ifelse } bdef
  /rg { /DeviceRGB cssubst { cs sc* } { rg } ifelse } bdef
  /k { k } bdef
  /cs { csresolve cs } bdef
  /sc { scresolve { sc* } { sc1 } ifelse } bdef
  /scn /sc load def
  /G { /DeviceGray cssubst { CS SC1 } { G } ifelse } bdef
  /RG { /DeviceRGB cssubst { CS SC* } { RG } ifelse } bdef
  /K { K } bdef
  /CS { csresolve CS } bdef
  /ri { ri } bdef
  /SC { scresolve { SC* } { SC1 } ifelse } bdef
  /SCN /SC load def
end

% ---------------- Paths ---------------- %

drawopdict begin
			% Path construction
  /m /moveto load def
  /l /lineto load def
  /c /curveto load def
  /v { currentpoint 6 2 roll curveto } def
  /y { 2 copy curveto } def
  /re {
   4 2 roll moveto  exch dup 0 rlineto  0 3 -1 roll rlineto  neg 0 rlineto
   closepath
  } def
  /h /closepath load def
			% Path painting and clipping
  /n { n } def
  /S { S } def
  /s { s } def
  /f { f } def
  /f* { f* } def
  /B { B } def
  /b { b } def
  /B* { B* } def
  /b* { b* } def
  /W { W } def
  /W* { W* } def
  /sh { resolvesh shfill } def
end

% ---------------- XObjects ---------------- %

/xobjectprocs mark		% <dict> -proc- -
  /Image { DoImage }
  /Form { DoForm }
  /PS { DoPS }
.dicttomark readonly def

% Note that the keys in defaultdecodedict are resolved (PostScript, not PDF)
% color space names.
/defaultdecodedict mark
  /DeviceGray { pop //01_1 } bind
  /DeviceRGB { pop //01_3 } bind
  /DeviceCMYK { pop //01_4 } bind
  /CIEBasedA { 1 get /RangeA .knownget not { //01_1 } if } bind
  /CIEBasedABC { 1 get /RangeABC .knownget not { //01_3 } if } bind
  /ICCBased {
     1 oget dup /Range .knownget {
       exch pop
     }{
       /N get [ exch {0 1} repeat ] readonly
     } ifelse
  } bind
  /Separation { pop //01_1 } bind
  /DeviceN {
    1 oget length [ exch {0 1} repeat ] readonly
  } bind
  /Indexed {
    pop [ 0 1 BitsPerComponent bitshift 1 sub ]
  } bind
.dicttomark readonly def

/checkaltimage {	% <resdict> checkaltimage <resdict[']>
  Printed {
    dup /Alternates knownoget {
      {
	dup /DefaultForPrinting knownoget {
	  {
	    /Image oget exch pop exit
	  } {
	    pop
	  } ifelse
	} {
	  pop
	} ifelse
      } forall
    } if
  } if
} bdef

/makeimagedict {	% <resdict> <newdict> makeimagedict <imagemask>
			% On return, newdict' is currentdict
  begin
  /Width 2 copy oget def
  /Height 2 copy oget def
  /BitsPerComponent 2 copy oget def
  /Interpolate 2 copy knownoget { def } { pop } ifelse
  makeimagekeys
} bdef
/makeimagekeys {	% <resdict> makeimagekeys <imagemask>
		% newdict is currentdict
		% Assumes Width, Height, BPC, Interpolate already copied.
  /ImageType 1 def
  /ImageMatrix Width 0 0
		% Handle 0-height images specially.
    Height dup 0 eq { pop 1 } if neg 0 1 index neg
    6 array astore def
  dup /ImageMask knownoget dup { and } if {
		% Image mask
		% Decode is required for the PostScript image operators.
                % AI8 writes bogus decode array [0 1 0 0 0 0 0 0]
    /Decode 2 copy knownoget { 0 2 getinterval } { //01_1 } ifelse def
		% BitsPerComponent may be missing for masks.
		% The spec requires it, but some producers omit it, and
		% Acrobat Reader doesn't care.
    /BitsPerComponent 2 copy known { pop } { 1 def } ifelse
    true
  } {
		% Opaque image
    dup /ColorSpace oget resolvecolorspace /ColorSpace exch def
		% Decode is required for the PostScript image operators.
    /Decode 2 copy knownoget not {
      ColorSpace //defaultdecodedict
      ColorSpace dup type /arraytype eq { 0 get } if get exec
    } if def
    false
  } ifelse
		% Even though we're going to read data,
		% pass false to resolvestream so that
		% it doesn't try to use Length (which may not be present).
  exch false resolvestream /DataSource exch def
} bdef

/DoImage {
  checkaltimage dup length 6 add dict
  1 index /SMask knownoget { 1 index exch /SMask exch put } if
  1 index /Mask knownoget { 1 index exch /Mask exch put } if
  makeimagedict doimage
} bdef
/makemaskimage {	% <datasource> <imagemask> <Mask> makemaskimage
			%   <datasource> <imagemask>, updates currentdict =
			%   imagedict
  dup type /arraytype eq {
    /ImageType 4 def
    /MaskColor exch def
  } {
		% Mask is a stream, another Image XObject.
		% Stack: datasource imagemask(false) maskstreamdict
    PDFfile fileposition exch
    dup length dict makeimagedict pop
		% In order to prevent the two data sources from being
		% aliased, we need to make at least one a reusable stream.
		% We pick the mask, since it's smaller (in case we need to
		% read all its data now).
		% Stack: datasource imagemask(false) savedpos
		% maskdict is currentdict
    /DataSource DataSource mark
      /Intent 1
      /AsyncRead true
    .dicttomark .reusablestreamdecode def
    PDFfile exch setfileposition
    currentdict end currentdict end
    5 dict begin
    /ImageType 3 def
    /InterleaveType 3 def
    /DataDict exch def
    /MaskDict exch def
    /ColorSpace DataDict /ColorSpace get def
  } ifelse
} bdef
/doimage {	% <imagemask> doimage -
		% imagedict is currentdict, gets popped from dstack
  DataSource exch
  PDFversion 1.4 ge { currentdict /SMask knownoget } { false } ifelse {
    makesoftmaskimage
  } {
    currentdict /Mask knownoget {
      makemaskimage
    } if
  } ifelse
		% Stack: datasource imagemask
   % image and imagemask can be redefined in gs_init.ps to tweak interpolation
   % after device-specific files are run. Don't bind them here.
   { currentdict end setfillstate /imagemask }
   { ColorSpace setcolorspace currentdict end setfillblend /image }
  ifelse
  .systemvar exec
   
		% Close the input stream, unless it is PDFfile or
		% PDFsource.
  dup dup PDFfile eq exch PDFsource eq or { pop } { closefile } ifelse
} bdef

/.paintform {	% <formdict> <resdict> <stream> .paintform -
  3 -1 roll dup /Group known {
    .paintgroupform
  } {
    pop pdfopdict .pdfruncontext
  } ifelse
} bdef

/DoForm {
    % Adobe 2nd edition of the PDF 1.3 spec makes /FormType
    % and /Matrix keys optional. Cope with the missing keys.
  dup length
  1 index /Matrix known
    { dict
    }
    { 1 add dict
      dup /Matrix { 1 0 0 1 0 0 } cvlit put
    }
  ifelse
  copy
  dup /FormType known not {
    dup length 1 add dict copy dup /FormType 1 put
  } if

  dup [ 2 index /Resources knownoget { oforce } { 0 dict } ifelse
  3 index false /resolvestream cvx
  /.paintform cvx
  ] cvx /PaintProc exch put
  execform
} bdef

/DoPS {
  true resolvestream cvx exec
} bdef

drawopdict begin
  /Do {
    setfillblend
    PDFfile fileposition exch
    dup Page /XObject rget { 
      exch pop dup /Subtype get xobjectprocs exch get
		% Don't leave extra objects on the stack while executing
		% the definition of the form.
      3 -1 roll 2 .execn
    } {
		% This should cause an error, but Acrobat Reader can
		% continue, so we do too.
      (%stderr) (w) file
      dup (****************Undefined XObject resource: ) writestring 
      dup 3 -1 roll write===
      flushfile
    } ifelse
    PDFfile exch setfileposition
  } bdef
end

% ---------------- In-line images ---------------- %

% Undo the abbreviations in an in-line image dictionary.
% Note that we must look inside array values.
% /I is context-dependent.
/unabbrevkeydict mark
  /BPC /BitsPerComponent  /CS /ColorSpace  /D /Decode  /DP /DecodeParms
  /F /Filter  /H /Height  /I /Interpolate  /IM /ImageMask  /W /Width
.dicttomark readonly def
/unabbrevvaluedict mark
  /AHx /ASCIIHexDecode  /A85 /ASCII85Decode  /CC /CalCMYK
  /CCF /CCITTFaxDecode  /CG /CalGray  /CR /CalRGB
  /DCT /DCTDecode  /CMYK /DeviceCMYK  /Fl /FlateDecode
  /G /DeviceGray  /RGB /DeviceRGB
  /I /Indexed  /LZW /LZWDecode  /RL /RunLengthDecode
.dicttomark readonly def
/unabbrevtypedict mark
  /nametype {
    //unabbrevvaluedict 1 index .knownget { exch pop } if
  }
  /arraytype {
    dup 0 1 2 index length 1 sub {
      2 copy get unabbrevvalue put dup
    } for pop
  }
.dicttomark readonly def
/unabbrevvalue {	% <obj> unabbrevvalue <obj'>
  oforce //unabbrevtypedict 1 index type .knownget { exec } if
} bdef

drawopdict begin
  /BI { mark } bdef
  /ID {
    counttomark 2 idiv dup 6 add dict begin {
      exch //unabbrevkeydict 1 index .knownget { exch pop } if
      exch unabbrevvalue def
    } repeat pop
    /File PDFsource def
    currentdict makeimagekeys doimage	
	% The Adobe documentation says that the data following ID
	% consists of "lines", and some PDF files (specifically, some files
	% produced by PCL2PDF from Visual Software) contain garbage bytes
	% between the last byte of valid data and an EOL.
        % Some files (PDFOUT v3.8d by GenText) have EI immediately following
        % the stream. Some have no EOL and garbage bytes.
        % Therefore, we skip all bytes before EI or EOL 
    0
      { PDFsource read not { //true exit } if
        dup 10 eq 1 index 13 eq or
          { pop PDFsource token pop /EI ne exit
          }
        if
        exch 69 eq 1 index 73 eq and { //false exit } if  % 'EI'
      }
    loop
    exch pop
      { /ID cvx /syntaxerror signalerror
      }
    if
  } bdef
end

% ================================ Text ================================ %

drawopdict begin
			% Text control
  /BT { BT } def
  /ET { ET } def
  /Tc { Tc } def
  /TL { TL } def
  /Tr { Tr } def
  /Ts { Ts } def
  /Tw { Tw } def
  /Tz { Tz } def
			% Text positioning
  /Td { Td } def
  /TD { TD } def
  /Tm { Tm } def
  /T* { T* } def
			% Text painting
  /Tj { Tj } def
  /' { ' } def
  /" { " } def
  /TJ { TJ } def
end

% ============================== Annotations ============================== %



% Get and normalize an annotation's rectangle.
/annotrect {		% <annot> annotrect <x> <y> <w> <h>
  /Rect get aload pop
  exch 3 index sub dup 0 lt { dup 5 -1 roll add 4 1 roll neg } if
  exch 2 index sub dup 0 lt { dup 4 -1 roll add 3 1 roll neg } if
} bdef

% Set an annotation color.
/annotsetcolor {	% <annot> annotsetcolor -
  /C knownoget { aload pop setrgbcolor } { 0 setgray } ifelse
} bdef

% Draw the border.  Currently, we ignore requests for beveling, and we
% don't round the corners of rectangles.
/strokeborder {		% <annot> <width> <dash> strokeborder -
  1 index 0 ne {	% do not draw if border width is 0
    gsave
    2 index annotsetcolor
    0 setdash dup setlinewidth
    exch annotrect
    2 { 4 index sub 4 1 roll } repeat
    2 { 4 index 0.5 mul add 4 1 roll } repeat
    rectstroke pop
    grestore
  } {
    pop pop pop
  } ifelse
} bdef

% Draw an annotation border.
/drawborder {		% <annot> drawborder -
  gsave
  dup /BS knownoget {
    dup /W knownoget not { 1 } if
    [] 2 index /S knownoget {
      /D eq { 2 index /D knownoget not { [3] } if exch pop } if
    } if 3 -1 roll pop strokeborder
  } {
    dup /Border knownoget {
      dup 2 get
      exch dup length 3 gt { 3 get } { pop [] } ifelse
      strokeborder
    } {
      pop
    } ifelse
  } ifelse
  grestore
} bdef

%
%   The PDF annotation F (flags) integer is bit encoded.
%   Bit 1 (LSB) Invisible:  1 --> Do not display if no handler.
%         Note:  We have no handlers but we ignore this bit.
%   Bit 2 Hidden:  1 --> Do not display.  We will not display if this bit is set.
%   Bit 3 Print:  1 --> Display if printing.  We will display if this bit set
%         (and not hidden) and Printed is true
%   Bit 4 NoZoom:  1 --> Do not zoom annotation even if image is zoomed.
%   Bit 5 NoRotate:  1 --> Do not rotate annotation even if image is rotated.
%   Bit 6 NoView:  0 --> Display if this is a 'viewer'.  We will display
%         if this bit is not set (and not hidden) and Printed is false
%   Bit 7 Read Only - 1 --> No interaction.  We ignore this bit
%
/annotvisible {			% <annot> annotvisible <visible>
  /F knownoget not { 0 } if 		% Get flag value
  dup 2 and 0 eq  			% Check hidden flag
  exch dup 4 and 0 ne Printed and	% Check print flag
  exch 64 and 0 eq Printed not and	% Check noview flag
  or					% Combine print and view
  and 					% Combine with 'hidden' flag test
} bdef

/drawwidget {			% <scalefactor> <annot> drawwidget -
  dup /AP knownoget {
	% Always use the Normal appearance.
    /N oget
		% Acrobat Distiller produces files in which this Form
		% XObject lacks Type and Subtype keys.  This is illegal,
		% but Acrobat Reader accepts it.  The only way we can
		% tell whether this is a Form or a set of sub-appearances
		% is by testing for the stream Length key.
    dup /Length known {
      		% If this is a form then simply use it
      true
    } {
      1 index /AS knownoget not {
      		% If we do not have AS then use any appearance
	{ exch pop oforce exit } forall true
      } { 
		% Stack: annot Ndict AS
		% Get the specified appearance.  If no appearance, then
		% display nothing - set stack = false.
	knownoget
      } ifelse
    } ifelse

		% Stack: scale annot appearance true
		% Stack: scale annot false
    {
      		% Draw appearance
      1 index annotrect pop pop translate
      2 index dup scale		% Apply scale factor
      DoForm
    } if
  } if pop pop
} bdef

%
%  For stamp object we have to determine the size of the output rectangle
%  and the size of the BBox for the stamp image.  From these we calculate
%  a scale factor for drawing the stamp.
%
/calcstampscale {		% <annot> calcstampscale scale
  dup annotrect 4 -2 roll pop pop pop	% get x width
  dup 0 lt { neg } if		% get magnitude
  exch /AP knownoget {
    /N knownoget {
      /BBox knownoget {
         aload pop 4 -2 roll pop pop pop
         div
      } {
        pop 1			% default to unity scaling
      } ifelse			% if we have /BBox
    } {
      pop 1
    } ifelse			% if we have /N
  } {
    pop 1
  } ifelse			% if we have /AP
} bdef

/drawlink {			% <annot> drawlink -
  dup drawborder
  1 exch drawwidget
} bdef

% Draw an annotation.
/drawannottypes mark
  /Link { drawlink } bind
  /Stamp { dup calcstampscale exch drawwidget } bind
.dicttomark readonly def
/drawannot {		% <annot> drawannot -
  dup annotvisible {
    gsave
    dup dup /Subtype get //drawannottypes exch .knownget {
      exec
    } {
      1 exch drawwidget		% Use drawwidget for everything else
    } ifelse			% type known
    grestore
  } if pop			% annotvisible
} bdef
currentdict /drawannottypes undef

end			% pdfdict
end			% GS_PDF_ProcSet
.setglobal
N N ,N 0N N N zN N N N &N 6N  N .N )N (N 'TN #N  N -N -N .^N +N *N #N $N .N /N /N 1N 5N 0 N 1N 1N 2N 4N 5hN 2N 4nN 2nN 54N 6\N 3N                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1994-2002 artofcode LLC.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf_font.ps,v 1.23.2.6 2002/04/16 06:11:29 giles Exp $
% pdf_font.ps
% PDF font operations.

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal
/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
GS_PDF_ProcSet begin
pdfdict begin

% We cache the PostScript font in an additional element of the
% font resource dictionary, called PSFont.

% ---------------- Encodings ---------------- %

% Apply a list of differences to an Encoding.
% Note that the differences may cause the array to grow.
/updateencoding {	% <encoding> <differences> updateencoding <enc'>
	% Calculate the length of the result.
  exch 0 2 index {
    dup type /nametype ne { exch pop } { pop 1 add } ifelse
  } forall
  1 index length .max array dup 0 4 -1 roll putinterval
  exch 0 exch {
		% Stack: enc' code element
    dup type /nametype ne
      { exch pop }
      { 3 copy put pop 1 add }
    ifelse
  } forall pop
} bdef

% Get the Encoding for a font.
/getencoding		% <base-encoding> <font-resource> getencoding <enc>
 { /Encoding knownoget
    { dup type /nametype eq
       { 
         % The published PDF specification says the Encoding name
         % "must be" one of the 3 predefined Encodings, implying
         % that an error should occur if it isn't.  However, Acrobat
         % Reader simply ignores unknown names, and since there are
         % some buggy applications that rely on this, we do the same.

         dup dup dup /MacRomanEncoding eq
         exch /MacExpertEncoding eq or 
         exch /WinAnsiEncoding eq or
           { exch pop findencoding
           }
           { pop
           }
         ifelse
       }
       { dup /BaseEncoding knownoget
	  { findencoding 3 -1 roll pop exch
	  }
	 if
	 /Differences knownoget { updateencoding } if
       }
      ifelse
    }
   if
 } bdef

% Rename a font with a generated name.
/renamefont {		% <fontdict> renamefont <font'>
  dup /FontName 2 copy get genfontname dup 5 1 roll put definefont
} bind def

% Adjust a font according to the Encoding and Widths in the font resource.
/adjustfont {		% <font-resource> <font> adjustfont <font'>
  getfontencoding
  getfontmetrics 4 -1 roll pop .updatefont { renamefont } if
} bind def

% Get the (possibly modified) encoding of a font.
/getfontencoding {	% <font-resource> <font> getfontencoding
			%   <font-resource> <font> <Encoding|null>
  1 index /Encoding known {
    dup /Encoding .knownget { 2 index getencoding } { null } ifelse
  } {
    null
  } ifelse
} bdef

/find_in_diff     % <Differences> <index> find_in_diff <bool>
{ false exch 0 4 3 roll
  { dup type /nametype ne { exch pop } { pop 1 add } ifelse
    2 copy eq {
      pop pop pop true 0 0 exit
    } if
  } forall
  pop pop
} bdef

% Get the metrics of a font, if specified.
/getfontmetrics {	% <font-resource> <font> <Encoding|null> getfontmetrics
			%   <font-resource> <font> <Encoding|null>
			%   <Metrics|null>
  2 index /Widths known {
    dup null eq { pop dup /Encoding get } if
    4 dict begin
      /Encoding exch def
      /Metrics Encoding length dict def
      exch
      dup /Widths oget /Widths exch def
		% Stack: font font-res
		% Note that widths are always based on a 1000-unit
		% character space, but the FontMatrix may specify
		% some other scale factor.  Compensate for this here,
		% by scaling the Widths if necessary.
      0.001 2 index /FontMatrix get 0 get div
		% Stack: font font-res mscale
      1 index /FirstChar oget dup 1 4 index /LastChar oget
       {	% Stack: font font-res mscale first-char index
	 Encoding 1 index get
	 Widths 2 index 4 index sub oget
	 	% Stack: font font-res mscale first-char index charname width
	 4 index mul
		% The following 'loop' is only context for 'exit'.
	 {	
		% Work around a bug in pdfTeX, which can generate Encoding
		% vectors containing nulls :
	   1 index null eq { exit } if
		% There is a hack here to deal with encodings where the
		% same character appears more than once, because the Metrics
		% dictionary works by character name, not by character code.
		% We prefer to take (1) non-zero width, and (2) width for 
		% the character code which appears in Differences.
	   Metrics 2 index .knownget not { 0 } if 0 ne {
	     5 index /Encoding knownoget not { exit } if
	     dup type /dicttype ne { pop exit } if
	     /Differences knownoget not { exit } if
	     3 index //find_in_diff exec not { exit } if
	   } if
	   2 copy Metrics 3 1 roll put
	   exit
	 } loop
	 pop pop pop
       }
      for pop
		% Now fill in the MissingWidth for any encoded characters
		% that aren't in Metrics already.  Note that built-in
		% fonts may have Widths/FirstChar/LastChar but no
		% FontDescriptor, so we must check for this.
		% Stack: font font-res mscale
      1 index /FontDescriptor knownoget {
	Metrics exch
	/MissingWidth knownoget { 2 index mul } { 0 } ifelse exch
	Encoding {
		% Stack: font font-res mscale missing-width metrics charname
		% Work around the abovementioned pdfTeX bug.
	  dup null ne {
	    2 copy known not { 2 copy 4 index put } if pop
	  } {
	    pop
	  } ifelse
	} forall pop pop pop
      } {
	pop
      } ifelse
    exch Encoding Metrics end
  } {
    null
  } ifelse
} bdef

currentdict /find_in_diff undef

% ---------------- Descriptors ---------------- %

% Partial descriptors for the 14 built-in fonts.  Note that
% from PDF 1.1 to PDF 1.2, the meaning of the Flag 6 in the FontDescriptor
% object has undergone a subtle change in its meaning which has serious
% consequences for searching with Acrobat:
% In PDF 1.1, the flag meant: Font has StandardEncoding
% In PDF 1.2, the flag means: Font has (subset of) StandardRomanCharacterSet
/standardfontdescriptors mark
  /Courier mark /Flags 16#23 .dicttomark
  /Courier-Oblique 1 index
  /Courier-Bold 1 index
  /Courier-BoldOblique 1 index
  /Helvetica mark /Flags 16#20 .dicttomark
  /Helvetica-Oblique 1 index
  /Helvetica-Bold 1 index
  /Helvetica-BoldOblique 1 index
  /Times-Roman mark /Flags 16#22 .dicttomark
  /Times-Bold 1 index
  /Times-Italic mark /Flags 16#62 .dicttomark
  /Times-BoldItalic 1 index
  /Symbol mark /Flags 16#4 .dicttomark
  /ZapfDingbats 1 index
.dicttomark readonly def

% ---------------- Utilities ---------------- %

/.glyphpath {	% <glyphname> <boolean> .glyphpath -
  % another glyphpath written in addxchar.ps does not work here...
  currentfont 3 1 roll exch
  currentfont dup length dict begin
    { 1 index /Encoding eq { pop [ 3 -1 roll ] def } { def } ifelse } forall
  currentdict end /.glyphpathfont exch definefont
  setfont <00> exch charpath setfont
} bdef

/makeboldfont {	% <basefont> <strokewidth> makeboldfont <boldfont>
  10 dict begin
    /strokewidth exch def
    /basefont exch def
    /FontMatrix matrix def
    %/FontName basefont /FontName get def
    /FontName /.boldfont def
    /FontType 3 def
    /Encoding basefont /Encoding get def
    /FontBBox [ basefont /FontBBox get cvx exec
      4 2 roll basefont /FontMatrix get transform
      4 2 roll basefont /FontMatrix get transform
    ] def
    /BuildGlyph {
      gsave
      exch begin
        basefont setfont
        strokewidth setlinewidth
        1 setlinejoin
        newpath
        0 0 moveto dup false .glyphpath stroke
        0 0 moveto glyphshow
        currentpoint setcharwidth
      end
      grestore
    } bind def
   currentdict
  end
  dup /FontName get exch definefont
} bind def

% Fabricate a font name by adding ?'s on the end.
/genfontname		% <name> genfontname <name>
 { dup length string cvs
    { (?) concatstrings
      dup cvn FontDirectory exch known not { cvn exit } if
    }
   loop
 } bdef

% Find a font, and adjust its encoding if necessary.
/.pdfdfndict mark
  /defaultfontname /Helvetica
.dicttomark readonly def
/pdffindfont {		% <font-resource> <fontname> pdffindfont <font>
		% If the font isn't available, synthesize one based on
		% its descriptor.
  dup /Font resourcestatus {
    pop pop findfont
  } {
    1 index /FontDescriptor knownoget {
		% Stack: font-res fontname fontdesc
      dup /Flags oget
      dup 16#40 and -6 bitshift		% 1, oblique/italic
      1 index 16#40000 and -17 bitshift add	% 2, bold
      exch 16#2 and 2 bitshift add	% 8, serif
		% We should look at the fixed flag, too.
		% Stack: font-res fontname fontdesc properties
      1 index /FontName oget exch
		% Analyzes font name and extract "Narrow" property
		% which is not described by the FontDescriptor Flags.
      0 2 index .fontnameproperties 4 and or
		% Rebind the default font name to Helvetica so that
		% fonts with no properties are handled correctly.
      //.pdfdfndict begin .substitutefontname end
		% Stack: font-res fontname fontdesc substname|null
      Fontmap 1 index known not {
		% No available good substitution, use the standard one.
	pop 1 index .substitutefont
      } if
      QUIET not {
	(Substituting font ) print dup =only
	( for ) print 2 index =only (.) = flush
      } if
      3 -1 roll pop findfont
		% Stack: font-res fontdesc font
		% If this is a small-caps font, replace the CharString
		% entries for a..z.
      exch /Flags oget 16#20000 and 0 ne {
	true .copyfontdict
	dup /CharStrings 2 copy get dup length dict .copydict
	4 index /FirstChar get 97 .max
	5 index /LastChar get 122 .min 1 exch {
		% Stack: font-res font' font' /CharStrings charstrings code
		% Note that this only remaps a-z, not accented characters.
	  5 index /Widths oget 1 index 7 index /FirstChar get sub oget
	  1 string dup 0 5 -1 roll put
		% Stack: font-res font' font' /CharStrings charstrings code
		%   width (x)
	  2 index exch dup cvn exch
	  dup 0 2 copy get 32 sub put 4 -1 roll {
			% Stack: operand (X) width
	    0 setcharwidth exch pop
	    currentfont /FontMatrix get matrix invertmatrix concat
	    0.7 dup scale 0 0 moveto show
	  } /exec cvx 4 packedarray cvx put
	} for put
	renamefont
      } if
    } {
		% No descriptor available, use the default algorithm.
      findfont
    } ifelse
  } ifelse adjustfont
} bdef
/findpdffont {	% <font-resource> <fontname> findpdffont <font>
  {} 3 1 roll			% proc fnres fnname
  [
    [ (,Bold)		{ .03 makeboldfont } ]
    [ (,BoldItalic)	{ .03 makeboldfont [ 1 0 .3 1 0 0 ] makefont } bind ]
    [ (,Italic)		{ [ 1 0 .3 1 0 0 ] makefont } bind ]
  ] {
    1 index dup length string cvs
    1 index 0 get tailmatch {	% proc fnres fnname []
      3 -1 roll pop exch 1 get	% proc fnres pre-fnname proc
      4 -1 roll pop 3 1 roll	% proc fnres pre-fnname
      exit
    } { pop pop } ifelse 	% proc fnres fnname
  } forall
  pdffindfont exch exec
} bdef

% ---------------- Type 1 fonts ---------------- %

/buildType1		% <Type1-font-resource> buildType1 <font>
 { dup /BaseFont get pdffindfont
 } bdef

% The state dictionary for the embedded Type 1 font reading procedure
% has the following keys and values:
%	data - stream (filter)
%	buffer, buffer2 - string
%	hexify - procedure to convert buffer to hex if needed
%	leftstr - string containing (non-negative) integer
%	sectionstr - string containing a character 0 .. 3
%	stream - (stream) dictionary
%	proc - procedure of the form {-dict- type1read}
%       pfbhdr - string containing 16#80 if PFB, 0 otherwise
% When the procedure is executing, this dictionary is current.
% leftstr and sectionstr are strings so that we can change their values
% reliably in case the font executes a restore!
% We also have to do something special about embedded fonts that
% execute definefont more than once -- that is the function of topFontDict.

% Read an embedded Type 1 font.
/readfontfilter {	% <proc> readfontfilter <filter>
  0 () /SubFileDecode filter
} bdef
/readtype1dict 5 dict dup begin
  /definefont {
    dup topFontDict eq topFontDict null eq or {
      dup wcheck not { dup length dict copy } if
      exch pop savedFontName exch
    } if
    //systemdict /definefont get exec
  } bdef
  /eexec {
	% Assume the font dictionary is directly below the file on the stack
    count 0 gt { /topFontDict 2 index cvlit store } if
    55665 /eexecDecode filter
    //systemdict begin readtype1dictcopy begin cvx stopped
    currentdict readtype1dictcopy eq { end } if
    currentdict //systemdict eq { end } if
     { stop } if
  } bdef
end readonly def
/readtype1 {		% <font-resource> <stream-dict> readtype1 <font>
		% Read the definition, using a procedure-based filter
		% that turns binary/hex conversion on and off
		% at the right times.
   1 index exch
   PDFfile fileposition 3 1 roll
   11 dict begin
     /leftstr (          ) 10 string copy def
       dup /Length1 oget leftstr cvs pop
     /sectionstr <00> 1 string copy def
     /pfbhdr <00> 1 string copy def
     /stream 1 index def
     true resolvestream /data exch def
     /buffer 1000 string def		% arbitrary
     /buffer2 buffer length 2.1 div cvi 1 sub string def
     /hexify /buf2hex load def
   currentdict end
   /type1read cvx 2 array astore cvx dup 0 get /proc 2 index put
   readfontfilter
		% Some buggy embedded fonts leave extra junk on the stack,
		% so we have to make a closure that records the stack depth
		% in a fail-safe way.
   //systemdict begin
		% The PDF specification is somewhat muddy about whether
		% an embedded font's name is supposed to be the BaseFont
		% from the Font object or the FontName from the descriptor.
		% Acrobat Distiller requires the former.  Save away the
		% name so we can substitute it at definefont time.
   //readtype1dict dup length 3 add dict copy begin
   1 index /BaseFont oget /savedFontName exch def
   /topFontDict null def
   /readtype1dictcopy currentdict def
    { run } aload pop count 1 sub 2 packedarray cvx exec
   end end
   count exch sub { pop } repeat
   PDFfile 3 -1 roll setfileposition
   /BaseFont oget findfont
   adjustfont
 } bdef

% Execute the appropriate reading procedure.
/type1read		% <dict> type1read <string>
 { begin leftstr cvi
    { type1read0 type1read1 type1read2 type1read3 } sectionstr 0 get get exec
   (          ) leftstr copy cvs pop end
 } bdef

% Read the next block of data into the buffer.
/type1readdata		% <left> <buffer> type1readdata <substring> <left'>
 { 0 2 index 2 index length .min getinterval
		% Adobe requires readstring to signal an error if given
		% an empty string.  Work around this nonsense here.
   dup length 0 ne { data exch readstring pop } if
   dup length 3 -1 roll exch sub
   DEBUG
    { dup =only ( read ) print
      1 index length =only (: ) print
      1 index == flush
    } if
 } bdef

% Read the initial byte to see if we need to skip a 6 byte PFB header
/type1read0 { 		% <left> type1read0 <string> <left'>
  sectionstr 0 1 put	% either way we go to the next stage
  pfbhdr type1readdata
  1 index 0 get 16#80 eq {
    (\n   **** Warning: Embedded Type1 font in PFB format is not valid PDF.)
    pdfformaterror
    DEBUG { (skipping PFB header) = flush } if
    exch pop buffer 0 5 getinterval type1readdata exch
    dup 4 get 256 mul 1 index 3 get add 256 mul
    1 index 2 get add 256 mul 1 index 1 get add
    DEBUG { (PFB segment length = ) print dup = } if
    exch pop  % discard the string keeping the PFB segment length
    2 copy ne {
      (\n   **** Warning: Type 1 PFB segment length and Length 1 value do not match.)
      pdfformaterror
      exch 	% keep the PFB length instead
    } if
    pop
    buffer type1readdata	% go ahead and read a block
  }
  if	% if not PFB, return pfbhdr string (first char of file, usually %).
} bdef

% Read the next block of the initial text portion.
/type1read1 {		% <left> type1read1 <string> <left'>
  DEBUG { (read1 ) print } if
  dup 0 eq {
    pop sectionstr 0 2 put
    stream /Length2 oget
			% Determine whether to hexify data for eexec.
    dup 8 lt {
      type1read2	% Hexify.
    } {
      DEBUG { (read2 ) print } if
      pfbhdr 0 get 16#80 eq {
        % eat 6 more bytes of PFB junk before proceeding
	DEBUG { (skipping PFB header in segment 2) = flush } if
	buffer 0 6 getinterval type1readdata exch
        dup 5 get 256 mul 1 index 4 get add 256 mul
	1 index 3 get add 256 mul 1 index 2 get add
        DEBUG { (PFB segment length = ) print dup = } if
	exch pop  % discard the string keeping the PFB segment length
	2 copy ne {
          (\n   **** Warning: Type 1 PFB segment length and Length 2 value do not match.)
          pdfformaterror
	  dup =
	  exch 		% keep the PFB length instead
	} if
	  pop
      } if
      buffer2 type1readdata exch
			% The check doesn't have to be 100% accurate:
			% hexifying is always OK.
      dup 0 8 getinterval 0 exch { or } forall
      128 ge {
	/hexify { } store
	/buffer2 buffer def	% We don't need an intermediate buffer.
      } if hexify exch
    } ifelse
  } {
    buffer type1readdata
  } ifelse
} bdef

% Convert a string from binary to hex for eexec.
% Free variables: buffer.
/buf2hex {		% <string> buf2hex <hexstring>
  buffer /ASCIIHexEncode filter dup 3 -1 roll writestring closefile
  buffer (>) search pop exch pop exch pop
} bdef

% Read the next block of the encrypted portion.
/type1trailer
(0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
0000000000000000000000000000000000000000000000000000000000000000\n\
cleartomark\n)
readonly def
/type1read2 {		% <left> type1read2 <string> <left'>
  DEBUG { (read2 ) print } if
   dup 0 eq
    { pop sectionstr 0 3 put
      stream /Length3 oget
      dup 0 eq
       { DEBUG { (trailer ) print } if
	 type1trailer exch
       }
       { 
         pfbhdr 0 get 16#80 eq {
           % eat 6 more bytes of PFB junk before proceeding
	   DEBUG { (skipping PFB header in segment 3) = flush } if
	   buffer 0 6 getinterval type1readdata exch
           dup 5 get 256 mul 1 index 4 get add 256 mul
	   1 index 3 get add 256 mul 1 index 2 get add
           DEBUG { (PFB segment length = ) print dup = } if
	   exch pop  % discard the string keeping the PFB segment length
	   2 copy ne {
           (\n   **** Warning: Type 1 PFB segment length and Length 3 value do not match.)
           pdfformaterror
	     exch 	% keep the PFB length instead
	   } if
	   pop
	   (\n) pdfformaterror
         } if
         type1read3
       }
      ifelse
    }
    { buffer2 type1readdata exch hexify exch
    }
   ifelse
} bdef

% Read the next block of the final text portion.
% When finished, this procedure returns an empty string.
/type1read3		% <left> type1read3 <string> <left'>
 { DEBUG { (read3 ) print } if
   buffer type1readdata
 } bdef

% ---------------- Type 3 fonts ---------------- %

/.notdefEncoding 256 { /.notdef } repeat 256 packedarray def

/buildType3 {		% <Type3-font-resource> buildType3 <font>
  8 dict begin
    /FontType 3 def
    /Resources 1 index /Resources knownoget { oforce } { 0 dict } ifelse def
    /FontBBox 1 index /FontBBox get cvx def
    /FontMatrix 1 index /FontMatrix oget def
    /CharProcs 1 index /CharProcs oget def
    1 index /Widths knownoget {
      /Widths exch def
      /FirstChar 1 index /FirstChar oget def
      /LastChar 1 index /LastChar oget def
    } if
    /FontName 1 index /Name get genfontname def
    /Encoding .notdefEncoding 2 index getencoding def
		% We have to define BuildChar rather than BuildGlyph:
		% there is no PDF equivalent of glyphshow, and we need
		% the character code to access the Widths.
    /BuildChar {
		% Stack: font charcode
      1 index begin 3 dict begin
      /Font 3 -1 roll def /CharCode 1 index def
      % Make unknown characters map to /.notdef
      Encoding exch get dup CharProcs exch known
        { CharProcs exch oget }
	{ pop CharProcs /.notdef oget }
      ifelse
      PDFfile fileposition exch
      false resolvestream
		% Stack: filepos stream
		% Don't let setgcolor set the color inside the BuildGlyph
		% procedure, because this causes an /undefined error.
      q null /FillColor gput null /StrokeColor gput
      Font /Resources get exch pdfopdict .pdfruncontext
      Q
      PDFfile exch setfileposition
      end end
    } bdef
    FontName currentdict end definefont exch pop
} bdef
/.adjustcharwidth {	% <wx> <wy> .adjustcharwidth <wx'> <wy'>
  /Widths where {
    begin
    CharCode FirstChar ge CharCode LastChar le and {
      exch pop Widths CharCode FirstChar sub get exch
    } if end
  } if
} bdef

% ---------------- TrueType fonts ---------------- %

/TTfonts mark
  /Arial /Helvetica
  /Arial,Italic /Helvetica-Oblique
  /Arial,Bold /Helvetica-Bold
  /Arial,BoldItalic /Helvetica-BoldOblique
  /CourierNew /Courier
  /CourierNew,Bold /Courier-Bold
  /TimesNewRoman /Times-Roman
  /TimesNewRoman,Italic /Times-Italic
  /TimesNewRoman,Bold /Times-Bold
  /TimesNewRoman,BoldItalic /Times-BoldItalic
  %
  /ArialBlack,Italic /Arial-BlackItalic
  /ArialNarrow,Bold /ArialNarrow-Bold
  /ArialNarrow,BoldItalic /ArialNarrow-BoldItalic
  /ArialNarrow,Italic /ArialNarrow-Italic
  /BookAntiqua,Bold /BookAntiqua-Bold
  /BookAntiqua,BoldItalic /BookAntiqua-BoldItalic
  /BookAntiqua,Italic /BookAntiqua-Italic
  /BookmanOldStyle,Bold /BookmanOldStyle-Bold
  /BookmanOldStyle,BoldItalic /BookmanOldStyle-BoldItalic
  /BookmanOldStyle,Italic /BookmanOldStyle-Italic
  /CenturyGothic,Bold /CenturyGothic-Bold
  /CenturyGothic,BoldItalic /CenturyGothic-BoldItalic
  /CenturyGothic,Italic /CenturyGothic-Italic
  /ComicSansMS,Bold /ComicSansMS-Bold
  /CourierNew,Bold /CourierNewPS-BoldMT
  /CourierNew,BoldItalic /CourierNewPS-BoldItalicMT
  /CourierNew,Italic /CourierNewPS-ItalicMT
  /FranklinGothicMedium,Italic /FranklinGothic-MediumItalic
  /Garamond,Bold /Garamond-Bold
  /Garamond,Italic /Garamond-Italic
  /Georgia,Bold /Georgia-Bold
  /Georgia,BoldItalic /Georgia-BoldItalic
  /Georgia,Italic /Georgia-Italic
  /Tahoma,Bold /Tahoma-Bold
  /TrebuchetMS,Bold /TrebuchetMS-Bold
  /TrebuchetMS,BoldItalic /Trebuchet-BoldItalic
  /TrebuchetMS,Italic /TrebuchetMS-Italic
  /Verdana,Bold /Verdana-Bold
  /Verdana,BoldItalic /Verdana-BoldItalic
  /Verdana,Italic /Verdana-Italic
.dicttomark readonly def

/buildTrueType {	% <TrueType-font-resource> buildTrueType <font>
  dup /BaseFont get
  dup TTfonts exch .knownget {
    exch pop
		% Hack required by the PDF specification: if the
		% font resource has Subtype = /TrueType but the actual
		% (installed) font is not a TrueType font, ignore the
		% Encoding in the font resource.  However, all current
		% versions of Acrobat Reader have the 14 base TrueType
		% fonts built in, so this produces incorrect output for
		% badly designed PDF files that specify these file names
		% with /Subtype = /TrueType but no embedded definition.
		% Compensate for this by removing the /Subtype key when
		% looking up the font.
    exch dup length dict copy dup /Subtype null put exch
  } if
  pdffindfont	% findfont for PDF
  % disable the auto-bold and auto-italic since it sometimes applies
  % so an already bold or italic substitute font
  %findpdffont	% findfont and auto-bold and/or auto-italic font for PDF
} bdef

% Read an embedded TrueType font.
/readtruetype {		% <font-resource> <stream-dict> readtruetype <font>
		% This is much simpler than readtype1, because we don't
		% have to deal with the tripartite .PFB format.
  1 index exch
  PDFfile fileposition 3 1 roll
  true resolvestream readfontfilter
		% Stack: filepos fontres stream
  1 index /Subtype get /CIDFontType2 eq {
    .loadttcidfont
		% Stack: filepos fontres cidfont
    1 index /CIDToGIDMap knownoget {
      dup /Identity eq {
	pop
      } {
	true resolvestream
		% The following doesn't work for CIDToGIDMaps with more
		% than 32K-1 entries.  We'll fix it later if necessary.
		% Stack: filepos fontres font mapstream
	dup 2 index /CIDCount oget 2 mul string readstring pop exch closefile
	exch dup length 5 add dict .copydict
	dup /FID undef
	dup /CIDMap 4 -1 roll put
	dup /CIDFontName get exch /CIDFont defineresource
      } ifelse
    } if
  } {
    null 2 index getencoding .loadpdfttfont
  } ifelse
  exch pop
  PDFfile 3 -1 roll setfileposition
		% Ignore both the Encoding and the Widths.
  exch pop
} bdef

% ---------------- Type 0 fonts ---------------- %

% Predefine the known CMaps, but only create them on demand.
/knownCMaps mark
  /Identity-H { /Identity-H 0 makeIdentityCMap }
  /Identity-V { /Identity-V 1 makeIdentityCMap }
.dicttomark def

/makeIdentityCMap {		% <cmapname> <wmode> .makeIdentityCMap -
  .currentglobal true .setglobal 3 1 roll
  /CIDInit /ProcSet findresource begin
  12 dict begin
    begincmap
    /WMode exch def
    /CMapName exch def
    /CIDSystemInfo 3 dict dup begin
      /Registry (Adobe) def
      /Ordering (Identity) def
      /Supplement 0 def
    end def
    %/CMapName (see above)
    /CMapVersion 1 def
    /CMapType 1 def
    %WMode (see above)
	% The PDF documentation says that these CMaps map CIDs
	% "1 to 65,536".  This is a misprint for 0 to 65,535.
    1 begincodespacerange
	% <0001> <00ff>  <0100> <ffff>
      <0000> <ffff>
    endcodespacerange
    1 begincidrange
	% <0001> <00ff> 1   <0100> <ffff> 256
      <0000> <ffff> 0
    endcidrange
    endcmap
    CMapName currentdict /CMap defineresource
    knownCMaps CMapName 2 index put
  end		% CMap
  end		% CIDInit ProcSet
  exch .setglobal
} bdef

/buildType0 {		% <Type0-font-resource> buildType0 <font>
  dup /BaseFont get	% FontName
  1 index /Encoding oget
  dup type /nametype eq {
    dup /CMap resourcestatus {
	pop pop /CMap findresource
    } {
	knownCMaps 1 index .knownget
	  { exch pop exec } { /undefined signalerror } ifelse
    } ifelse
  } {
    PDFfile fileposition exch
    dup /CMapName get exch true resolvestream cvx exec
    /CMap findresource
    exch PDFfile exch setfileposition
  } ifelse		% CMap
  [
    3 index /DescendantFonts oget { exec resourcefont } forall
  ]			% subfonts
  composefont
		% Stack: fontres font
  1 index /FontMatrix knownoget {
    dup aload pop true {0 0 1 0 0 1} {3 -1 roll eq and} forall {
      1 index exch makefont exch /FontName get exch definefont
    } {
      pop
    } ifelse
  } if exch pop
} bdef

% ---------------- CIDFontType0/2 fonts ---------------- %

% Insert metrics into a CIDFont, by saving the PDF W, W2, DW, and DW2
% arrays and using a (currently very inefficient) CDevProc.
% For detail, refer "PDF Reference" third edition, p. 337,
% "5.6.3 CIDFonts" and table "Entries in a CIDFont dictionary".
 
/.pdfDefaultDW  1000 def
/.pdfDefaultDW2 [ 880 -1000 ] def

/addCIDmetrics {	% <CIDFont-resource> <CIDFont> addCIDmetrics <fontdict>
  dup length 5 add dict .copydict
  dup /FID undef
  dup /UniqueID undef
  dup /XUID undef
	% Insert the widths into the font.

	% Stack: pdfresource newfont

  1 index /DW .knownget {
    1 index /DW 3 -1 roll put
    } {
    dup /DW .pdfDefaultDW put
    } ifelse


  1 index /W .knownget {
    dup 2 index /W 3 -1 roll put
    .pdfMakeInternalW 1 index /.internalW 3 -1 roll put
  } if


  1 index /DW2 .knownget {
    1 index /DW2 3 -1 roll put
  } {
    dup /DW2 .pdfDefaultDW2 put
  } ifelse


  1 index /W2 .knownget {
    dup 2 index /W2 3 -1 roll put
    .pdfMakeInternalW2 1 index /.internalW2 3 -1 roll put
  } if


  dup /CDevProc 1 index /CIDWProc load /exec load 3 packedarray cvx put
  exch pop
} bdef

/.pdfMakeInternalMTXArray { % <mtx_array> <item_size> .pdfConvertInternalW <mtx_array'>

  % convert /W or /W2 to internal expression
  %
  %   mtx_array: original /W or /W2 array
  %   item_size: number of metrics values per CID
  %
  %   for detail of the metrics list format in PDF,
  %   refer PDF Ref. p.317 "Glyph Metrics in CIDFonts".
  % 
  %   format of single entry in internal expression
  %
  %     [
  %       [cid_begin cid_end]
  %       value_is_varied (bool)
  %       [ [values for cid_begin...]
  %         [values for cid_begin + 1]
  %         ... ]
  %     ]
  %

  7 dict
  begin
    /itemSize exch def
    /M exch def			% original /W or /W2
    /Msize M length def
    /Mi { M i get } def		% W[i]
    /Mi1 { M i 1 add get } def	% W[i + 1]
    /putMTXEntry <<
      /arraytype   {
         [
           [Mi Mi Mi1 length add 1 sub]
           true
           [
             0 itemSize Mi1 length 1 sub {
               [ exch 1 1 index itemSize add 1 sub { Mi1 exch get } for ]
             } for
           ]
         ]
         /i i 2 add def
      }
      /integertype {
         [
           [Mi Mi1]
           false
           [[ i 2 add 1 i 1 add itemSize add { M exch get } for ]]
         ]
         /i i 3 add def
      }
    >> def

    /i 0 def

    [ { putMTXEntry Mi1 type get exec i Msize ge { exit } if } loop ]
  end
} def

/.pdfMakeInternalW  { dup length 0 gt { 1 .pdfMakeInternalMTXArray } if } def
/.pdfMakeInternalW2 { dup length 0 gt { 3 .pdfMakeInternalMTXArray } if } def

/.pdfGetMTXByCID { % <internalMTXArray> <cid>
                   %     .pdfGetMTXByCID
                   %         { <MTXEntry> true | false }

  % get values for given CID from internal format of /W or /W2

  exch
  {
    {
      dup 0 get {} forall      % Stack: <cid> <entry> <cid_0> <cid_1>
      3 index lt { pop pop false exit } if
      2 index exch sub dup 0 lt { pop pop false exit } if
      1 index 1 get not { pop 0 } if
      exch 2 get exch get true exit
    } loop
    { exit } if
  } forall
  dup type /arraytype eq { exch pop true } { pop false } ifelse
} def


% Apply the [D]W[2] metrics to a character before displaying.
/CIDWProc {		% <w0x> <w0y> <llx> <lly> <urx> <ury>
			%   <w1x> <w1y> <vx> <vy> <cid> <font> CIDWproc
			%   <w0x'> ... <vy'>

  begin % push <font> to currentdict
    % <w1x> <w1y> <vx> <vy> won't be used and replaced, discard now
    5 1 roll pop pop pop pop

    {
      currentdict /DW .knownget not {   % no DW
        .pdfDefaultDW exit              % replace <w0x> by defaultDW
      } if

      currentdict /.internalW .knownget not {    % no W
        exit                            % use already-stacked DW
      } if

      dup length 0 eq {                 % W is null array
        pop                             % discard unusable W
        exit                            % use already-stacked DW
      } if

      % W is finite array, try to get W_cid
      2 index .pdfGetMTXByCID {           % got W, discard DW
        exch pop {} forall
        exit
      } if

      exit
    } loop

    1000 div                    % <w0x'> (normalized W)
    0                           % <w0y'>

    % Stack: <w0x> <w0y> <llx> <lly> <urx> <ury> <cid> <w0x'> <w0y'>
    9 -2 roll pop pop           % discard <w0x> <w0y>
    7  2 roll                   % put <w0x'> <w0y'>

    % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <cid>
    0                           % <w1x'>
    exch                        % put <w1x'>

    % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <w1x'> <cid>
    {
      currentdict /DW2 .knownget not {  % no DW2, use defaultDW2
        .pdfDefaultDW2 exit
      } if

      currentdict /.internalW2 .knownget not {   % has DW2, no W2
        exit                            % use already-stacked DW2
      } if

      dup length 0 eq {                 % W2 is null array
        pop                             % discard unusable W2
        exit                            % use already-stacked DW2
      } if

      2 index .pdfGetMTXByCID {		% got W2_cid, discard DW2
        exch pop
        exit
      } if

      % could not get W2_cid
      exit

    } loop

    exch pop                            % discard <cid>


    % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <w1x'> { [<vy'> <w1y'>] | [<w1y'> <vx'> <vy'>] }
    dup length 2 eq {                   % this is DW2
      {1000 div} forall exch
      4 index 7 index add 2 div         % <vx'> = (<urx> + <llx>) / 2
      exch
    }{                                  % assume W2
      {1000 div} forall
    } ifelse
  end                                   % recover currentdict

} def



%----------------------------------------------------------------

% <string> <match> tailmatch ==> <pre> true
%                            ==> <string> false
/tailmatch {
  2 copy length 1 index length .min
  dup 2 index length exch sub exch getinterval
  1 index eq {
    length 1 index length exch sub
    0 exch getinterval true
  } {
    pop false
  } ifelse
} bind def

/makeboldcidfont {
  16 dict begin
    /strokewidth exch def
    /basecidfont exch def
    /FontMatrix [ 1 0 0 1 0 0 ] def

    /CIDFontName /.boldfont def
    /CIDFontType 1 def

    /basefont-H /.basefont-H /Identity-H [ basecidfont ] composefont def
    /basefont-V /.basefont-V /Identity-V [ basecidfont ] composefont def

    /CIDSystemInfo dup basecidfont exch get def
    /FontBBox [ basecidfont /FontBBox get cvx exec
      4 2 roll basecidfont /FontMatrix get transform
      4 2 roll basecidfont /FontMatrix get transform
    ] def

    /tmpstr 2 string def
    /BuildGlyph {
      gsave
      exch begin
        dup 256 idiv tmpstr exch 0 exch put
        256 mod tmpstr exch 1 exch put
        rootfont /WMode known { rootfont /WMode get 1 eq } { false } ifelse
        { basefont-V } { basefont-H } ifelse setfont
        strokewidth setlinewidth
        1 setlinejoin
        newpath
        0 0 moveto tmpstr false charpath stroke
        0 0 moveto tmpstr show
        currentpoint setcharwidth
      end
      grestore
    } bind def

   currentdict
  end
  dup /CIDFontName get exch /CIDFont defineresource
} bind def

% <CIDFont-resource> <CIDFontName> findCIDFont <CIDFont-resource> <font>
%   CIDFont-resource is not modified.
/findCIDFont {
  {
    dup /CIDFont resourcestatus {
      pop pop /CIDFont findresource
      exit
    } if

    dup dup length string cvs
    (,Bold) tailmatch {
      exch pop
      cvn findCIDFont 0.03 makeboldcidfont
      exit
    } if
    (,Italic) tailmatch {
      exch pop
      cvn findCIDFont
      [ 1 0 0.3 1 0 0 ] makefont
      exit
    } if
    (,BoldItalic) tailmatch {
      exch pop
      cvn findCIDFont 0.03 makeboldcidfont
      [ 1 0 0.3 1 0 0 ] makefont
      exit
    } if
    pop

    1 index /CIDSystemInfo get begin Registry (-) Ordering end
    concatstrings concatstrings
    cvn
    QUIET not {
      (Substituting ) print dup ==only
      ( for ) print 1 index ==only (.\n) print
    } if
    exch pop
    /CIDFont findresource
    exit
  } loop
} bdef

/buildCIDType0 {	% <CIDFontType0-font-resource> buildCIDType0 <font>
  dup /BaseFont get exch 1 index findCIDFont
  addCIDmetrics /CIDFont defineresource
} bdef

/buildCIDType2 {	% <CIDFontType2-font-resource> buildCIDType2 <font>
  dup /BaseFont get exch 1 index findCIDFont
  addCIDmetrics /CIDFont defineresource
} bdef

% ---------------- Other embedded fonts ---------------- %

/fontloadprocs mark
  /Type1C /readType1C cvx
  /CIDFontType0C /readCIDFontType0C cvx
.dicttomark readonly def

% Read an embedded compressed font.
/readType1C {		% <font-resource> <stream-dict> readType1C <font>
  1 index exch
  PDFfile fileposition 3 1 roll
  dup true resolvestream dup readfontfilter
		% Stack: pos resource streamdict stream filter
  3 index /FontDescriptor oget /FontName oget
  1 index FRD
  closefile closefile pop
  PDFfile 3 -1 roll setfileposition
  /FontDescriptor oget /FontName oget findfont
  adjustfont
} bdef

% Read an embedded CFF CIDFont.
/readCIDFontType0C {  % <font-resource> <stream-dict> readCIDFontType0C <font>
  PDFfile fileposition 3 1 roll
  dup true resolvestream dup readfontfilter
		% Stack: pos resource streamdict stream filter
  3 index /FontDescriptor oget /FontName oget
  1 index FRD
  closefile closefile pop
  PDFfile 3 -1 roll setfileposition
		% Some broken Adobe software produces PDF files in which
		% the FontName of the CFF font and the FontName in the
		% FontDescriptor don't match the BaseFont in the font.
		% Use the FontName, rather than the BaseFont, here.
  dup /FontDescriptor oget /FontName oget /CIDFont findresource
  addCIDmetrics dup /CIDFontName get exch /CIDFont defineresource
} bdef

% ---------------- Font lookup ---------------- %

/fonttypeprocs mark		% <font-resource> -proc- <font>
  /Type0 /buildType0 cvx
  /Type1 /buildType1 cvx
  /MMType1 1 index
  /Type3 /buildType3 cvx
  /TrueType /buildTrueType cvx
  /CIDFontType0 /buildCIDType0 cvx
  /CIDFontType2 /buildCIDType2 cvx
.dicttomark readonly def

/resourcefont			% <font-resource> resourcefont <font>
 { dup /PSFont .knownget
    { /FID .knownget { type /fonttype eq } { false } ifelse }
    { false }
   ifelse
    { /PSFont get
    }
    { dup dup /FontDescriptor knownoget
       {	% Stack: font-res font-res font-desc
	 dup /FontFile knownoget
	  { exch pop readtype1 true }
	  { dup /FontFile2 knownoget
	     { exch pop readtruetype true }
	     { /FontFile3 knownoget
		{ dup /Subtype get fontloadprocs exch get exec true }
		{ false }
	       ifelse
	     }
	    ifelse
	  }
	 ifelse
       }
       { false }
      ifelse
		% Stack: font-res font-res false
		%  -or-: font-res font true
      not
       { dup /Subtype get fonttypeprocs exch get exec }
      if
      2 copy /PSFont exch put
      exch pop
    }
   ifelse
 } bdef

drawopdict begin
  /d0 {
    .adjustcharwidth setcharwidth
  } bdef
  /d1 {
    6 -2 roll .adjustcharwidth 6 2 roll setcachedevice
  } bdef
  /Tf {
    1 index Page /Font rget not { 1 index /invalidfont signalerror } if
    resourcefont exch Tf pop
  } bdef
end

end			% pdfdict
end			% GS_PDF_ProcSet
.setglobal
                                   `[SICADY}iUIHQ]dk}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf_main.ps,v 1.35.2.2 2002/04/02 13:57:27 mpsuzuki Exp $
% pdf_main.ps
% PDF file- and page-level operations.

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal
/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
pdfdict begin

% Patch in an obsolete variable used by some third-party software.
/#? false def

% Test whether the current output device handles pdfmark.
/.writepdfmarkdict 1 dict dup /pdfmark null put readonly def
/.writepdfmarks {	% - .writepdfmarks <bool>
  currentdevice //.writepdfmarkdict .getdeviceparams
  mark eq { false } { pop pop true } ifelse
  systemdict /DOPDFMARKS known or 
} bind def

% For simplicity, we use a single interpretation dictionary for all
% PDF graphics execution, even though this is too liberal.
/pdfopdict mark
  objopdict { } forall
  drawopdict { } forall
  /endstream { exit } bind
  (%%EOF) cvn { exit } bind		% for filters
	% PDF 1.1 operators
  /BX { /BXlevel BXlevel 1 add store } bind
  /EX { /BXlevel BXlevel 1 sub store } bind
  /PS { cvx exec } bind
	% PDF 1.2 operators
  /BMC { pop } bind
  /BDC { pop pop } bind
  /EMC { }
  /MP { pop } bind
  /DP { pop pop } bind
.dicttomark readonly def

% ======================== Main program ======================== %

end			% pdfdict
userdict begin

/defaultfontname /Times-Roman def

% Make sure the registered encodings are loaded, so we don't run the risk
% that some of the indices for their names will overflow the packed
% representation.  (Yes, this is a hack.)
SymbolEncoding pop
DingbatsEncoding pop

% Redefine 'run' so it recognizes PDF files.
systemdict begin
/.runps /run load def
/runpdfstring 50 string def		% length is arbitrary
/run {
  dup type /filetype ne { (r) file } if
  dup ( ) .peekstring {
    (%) eq {
      dup (  ) .peekstring {
	(%P) eq {
	  dup //runpdfstring {
		% Some invalid files might have extra-long first lines....
	    { readline } .internalstopped not { pop pop exit } if
	    pop =string
	  } loop
	  //runpdfstring (%PDF-) anchorsearch {
	    pop pop runpdf
	  } {
	    pop cvx .runexec
	  } ifelse
	} {
	  cvx .runps
	} ifelse
      } {
	closefile
      } ifelse
    } {
      cvx .runps
    } ifelse
  } {
    closefile
  } ifelse
} bind odef
currentdict /runpdfstring .undef

/runpdf			% <file> runpdf -
 { userdict begin
   /Page# null def
   /Page null def
   /DSCPageCount 0 def
   /PDFSave null def
   GS_PDF_ProcSet begin
   pdfdict begin
   pdfopen begin
   Trailer /Root oget /Pages oget /CropBox knownoget
    { mark /CropBox 3 -1 roll /PAGES pdfmark
    }
   if
   /FirstPage where 
    { pop FirstPage dup pdfpagecount gt
      { (\nRequested FirstPage is greater than the number of pages in the file: ) print
        pdfpagecount = flush
      } if
    } {
      1
    } ifelse
   1
   /LastPage where { pop LastPage pdfpagecount .min } { pdfpagecount } ifelse
   2 index 1 index gt
    { (   No pages will be processed \(FirstPage > LastPage\).) = flush }
    { QUIET not
      { (Processing pages ) print 2 index =only ( through ) print dup =only
        (.) = flush
      }
     if
    }
   ifelse
    { dup /Page# exch store
      QUIET not { (Page ) print dup == flush } if
      pdfgetpage pdfshowpage
    } for
   currentdict pdfclose
   end			% temporary dict
   end			% pdfdict
   end			% userdict
 } bind def
end			% systemdict
% Redefine the procedure that the C code uses for running piped input.
% It is OK to use { (%stdin) run } here, because a startjob cannot occur.
/.runstdin {
  { (%stdin) run } execute0
} bind def

end			% userdict
pdfdict begin

% ======================== File parsing ======================== %

% Read the cross-reference and trailer sections.

/traileropdict mark
  (<<) cvn { mark } bind
  (>>) cvn /.dicttomark load
  ([) cvn { mark } bind		% ditto
  (]) cvn dup load
%  /true true		% see .pdfexectoken in pdf_base.ps
%  /false false		% ibid.
%  /null null		% ibid.
  /R { /resolveR cvx 3 packedarray cvx } bind	% see Objects below
  /startxref /exit load
.dicttomark readonly def

% Because of EOL conversion, lines with fixed contents might be followed
% by one or more blanks.
/lineeq			% <filestr> <conststr> lineeq <bool>
 { anchorsearch
    { pop { ( ) anchorsearch not { () eq exit } if pop } loop }
    { pop false }
   ifelse
 } bind def
/linene { lineeq not } bind def

% Read (mostly scan) the cross-reference table.
/readxref		% <pos> readxref <trailerdict>
 { PDFoffset add PDFfile exch setfileposition
		% In some PDF files, this position actually points to
		% white space before the xref line.  Skip over this here.
   { PDFfile fileposition PDFfile read pop 32 gt { exit } if pop
   } loop
   PDFfile exch setfileposition
		% The PDF specification says that the 'xref' must be on a line
		% by itself. The code here formerly used readline and linene to
		% check this. However, Acrobat Reader only requires the line to
		% begin with 'xref', and there are enough applications producing
		% non-compliant PDF files that we have to do this too.
   PDFfile pdfstring 0 4 getinterval readstring pop
   (xref) ne { /readxref cvx /syntaxerror signalerror } if
		% Store the xref table entry position for each object.
		% We only need to read the run headers, not every entry.
    { PDFfile token pop		% first object # or trailer
      dup /trailer eq { pop exit } if
      PDFfile pdfstring readline pop
      token pop			% entry count
      exch pop exch
		% This section might be adding new objects:
		% ensure that Objects and Generations are big enough.
		% Stack: count obj#
      2 copy add growPDFobjects
      PDFfile fileposition 3 -1 roll
       { Objects 2 index lget null eq	% later update might have set it
	  { Objects 2 index 2 index cvx lput }
         if exch 1 add exch 20 add
       }
      repeat PDFfile exch setfileposition pop
    } loop
   count /pdfemptycount exch def
   PDFfile traileropdict .pdfrun
 } bind def

% Open a PDF file and read the header, trailer, and cross-reference.
/pdfopen {		% <file> pdfopen <dict>
  pdfopenfile begin
  pdfopencache
  .writepdfmarks {
	% Copy bookmarks (outline) to the output.
    Trailer /Root oget /Outlines knownoget {
      /First knownoget {
	{ dup writeoutline /Next knownoget not { exit } if } loop
      } if
    } if
  } if		% end .writepdfmarks
  currentdict end
} bind def
/pdfopencache {		% - pdfopencache -
	% Create and initialize some caches.
  /PageCount pdfpagecount def
  /PageNumbers PageCount 65534 .min dict def
  /PageIndex PageCount 65534 .min array def
} bind def
/pdfopenfile {		% <file> pdfopenfile <dict>
   pdfdict readonly pop		% can't do it any earlier than this
   15 dict begin
   /LocalResources 0 dict def
   /DefaultMatrix null def	% establish binding
   /Printed where { pop } {
		% Guess whether the output device is a printer.
     /Printed currentpagedevice /OutputFile known def
   } ifelse
   /PSLevel1 where { pop } { /PSLevel1 false def } ifelse
   cvlit /PDFfile exch def
   /PDFsource PDFfile def
   /Repaired false def
   PDFfile dup 0 setfileposition pdfstring readstring 
   not {/pdfopen cvx /syntaxerror signalerror} if
   (%PDF-) search not {/pdfopen cvx /syntaxerror signalerror} if
   length /PDFoffset exch def pop cvr /PDFversion exch def
   findxref
   initPDFobjects
	% Read the last cross-reference table.
   readxref /Trailer exch def
   Trailer /Encrypt known
    { pdf_process_Encrypt	% signal error
    }
   if
	% Read any previous cross-reference tables.
   Trailer { /Prev .knownget not { exit } if readxref } loop
   Repaired { printrepaired } if
   currentdict end
 } bind def

% Skip backward over the %%EOF at the end of the PDF file, and read
% the preceding startxref line.  The PDF specification unambiguously
% requires that the %%EOF appear on a line by itself, and that the
% startxref and the following position value appear on separate lines;
% however, some applications (including, apparently, Acrobat Distiller
% on the Macintosh) may add up to 2K of garbage after the %%EOF, and some
% other applications also truncate the %%EOF to %%EO, and/or put the
% startxref and the following value on the same line.
% A file reported from Distiller 3.02b for AIX 4.1.1 has 2076 bytes
% of garbage. The tolerance is increased to 4K to cover future
% applications and bigger allocation units.
/findxref {		% - findxref <xrefpos>
  PDFfile dup dup 0 setfileposition bytesavailable
  dup /PDFfilelen exch def
	% Find the last %%EOF string (within 4096 bytes)
  4096 sub PDFoffset .max
  2 copy setfileposition
  PDFfilelen exch sub string 1 index exch readstring pop {
    (\015%%EO) search {		% Adobe can handle truncated key string
      pop pop			% if found, keep searching 'post' string
    } {
      (\012%%EO) search
	{ pop pop } { exit } ifelse	% exit if neither string found
    } ifelse
  } loop
  PDFfilelen exch length sub 4 sub PDFoffset .max exch 1 index setfileposition
	% Stack: eofpos
	% Check for whether this is, in fact, a valid PDF file.
  dup PDFfilelen exch sub dup dup 7 gt exch 6 lt or {
    pop true
  } {
    string PDFfile exch readstring pop
    dup (%%EOF\n) eq exch dup (%%EOF\r) eq
    exch (%%EOF\r\n) eq or or not
  } ifelse {
    (
   **** This file has a corrupted %%EOF marker, or garbage after the %%EOF.
) pdfformaterror
  } if
  PDFfile exch setfileposition
	% Now read the startxref and xref start position.
  prevline token not { null } if dup type /integertype eq {
    exch pop cvi		% xref start position
    exch PDFfile exch setfileposition
    prevline (startxref) linene { /findxref cvx /syntaxerror signalerror } if
    pop
  } {	% else, this file has 'startxref #####' format
    (startxref) ne { /findxref cvx /syntaxerror signalerror } if
    cvi		% xref start position
    (
   **** The format of the startxref line in this file is invalid.
) pdfformaterror
    exch PDFfile exch setfileposition
  } ifelse
} bind def
/stderrfile (%stderr) (w) file def
/stderrprint {                % <string> stderrprint -
  //stderrfile dup 3 -1 roll writestring flushfile
} bind def
/pdfformaterror {	% <string> pdfformaterror -
  stderrprint
  /Repaired true store
} bind def
/printrepaired {
  Trailer /Info knownoget {
    /Producer knownoget not { null } if
  } {
    null
  } ifelse
  dup null eq {
    pop (\
   **** Please notify the author of the software that produced this file
)
  } {
    (   **** The file was produced by ) stderrprint
	% Handle a Unicode Producer.
    (\376\377) anchorsearch {
      pop dup length 2 idiv string 0 1 2 index length 1 sub {
		% Stack: origstr newstr i
	1 index exch 3 index 1 index 2 mul 1 add get put
      } for exch pop
    } if
    stderrprint
    (:
   **** please notify the author of this software
)
  } ifelse stderrprint
(\
   **** that the file does not conform to Adobe's published PDF
   **** specification.  Processing of the file will continue normally.

) stderrprint
} bind def

% Write the outline structure for a file.  Uses linkdest (below).
/writeoutline		% <outlinedict> writeoutline -
 { mark
   0 2 index /First knownoget
    { { exch 1 add exch /Next knownoget not { exit } if } loop }
   if
		% stack: dict mark count
   dup 0 eq
    { pop 1 index
    }
    { 2 index /Count knownoget { 0 lt { neg } if } if
      /Count exch 3 index
    }
   ifelse linkdest /Title oget /Title exch /OUT pdfmark
   /First knownoget
    { { dup writeoutline /Next knownoget not { exit } if } loop }
   if
 } bind def

% Close a PDF file.
/pdfclose		% <dict> pdfclose -
 { begin
   PDFfile closefile
   end
 } bind def

% ======================== Page accessing ======================== %

% Get a (possibly inherited) attribute of a page.
/pget			% <pagedict> <key> pget <value> -true-
			% <pagedict> <key> pget -false-
 { 2 copy knownoget
    { exch pop exch pop true
    }
    { exch /Parent knownoget
       { exch pget }
       { pop false }
      ifelse
    }
   ifelse
 } bind def

% Get the value of a resource on a given page.
/rget {			% <resname> <pagedict> <restype> rget <value> -true-
			% <resname> <pagedict> <restype> rget -false-
  LocalResources 1 index knownoget {
     3 index knownoget
  } {
    false
  } ifelse {
    exch pop exch pop exch pop true
  } {
    exch /Resources pget {
      exch knownoget { exch knownoget } { pop false } ifelse
    } {
      pop pop false
    } ifelse
  } ifelse
} bind def

% Get the total number of pages in the document.
/pdfpagecount		% - pdfpagecount <int>
 { Trailer /Root oget /Pages oget /Count oget
 } bind def

% Find the N'th page of the document by iterating through the Pages tree.
% The first page is numbered 1.
/pdffindpageref {		% <int> pdffindpage <objref>
  dup Trailer /Root oget /Pages get
    {		% We should be able to tell when we reach a leaf
		% by finding a Type unequal to /Pages.  Unfortunately,
		% some files distributed by Adobe lack the Type key
		% in some of the Pages nodes!  Instead, we check for Kids.
      dup oforce /Kids knownoget not { exit } if
      exch pop null
      0 1 3 index length 1 sub {
         2 index exch get
	 dup oforce dup /Kids known { /Count oget } { pop 1 } ifelse
		% Stack: index kids null noderef count
	 dup 5 index ge { pop exch pop exit } if
	 5 -1 roll exch sub 4 1 roll pop
      } for exch pop
		% Stack: index null|noderef
      dup null eq { pop pop 1 null exit } if
    } loop
		% Stack: index countleft noderef
   1 index 1 ne { pop pop /pdffindpage cvx /rangecheck signalerror } if
   exch pop
   PageIndex 2 index 1 sub 65533 .min 2 index oforce put
   PageNumbers 1 index oforce 3 index dup 65534 le
    { put }
    { pop pop pop }	% don't store more than 65534 pagenumbers
   ifelse
   exch pop
} bind def
/pdffindpage {		% <int> pdffindpage <pagedict>
  pdffindpageref oforce
} bind def

% Find the N'th page of the document.
% The first page is numbered 1.
/pdfgetpage		% <int> pdfgetpage <pagedict>
 { PageIndex 1 index 1 sub dup 65533 lt
    { get }
    { pop pop null }
   ifelse
   dup null ne
    { exch pop oforce }
    { pop pdffindpage }
   ifelse
 } bind def

% Find the page number of a page object (inverse of pdfgetpage).
/pdfpagenumber		% <pagedict> pdfpagenumber <int>
 {	% We use the simplest and stupidest of all possible algorithms....
   PageNumbers 1 index .knownget
    { exch pop
    }
    { 1 1 PageCount 1 add	% will give a rangecheck if not found
       { dup pdfgetpage oforce 2 index eq { exit } if pop
       }
      for exch pop
    }
   ifelse
 } bind def

% Display a given page.
/boxrect		% [<llx> <lly> <urx> <ury>] boxrect <x> <y> <w> <h>
 { aload pop exch 3 index sub exch 2 index sub
 } bind def
/resolvedest {		% <name|string|other> resolvedest <other|null>
  dup type /nametype eq {
    Trailer /Root oget /Dests knownoget {
      exch knownoget not { null } if
    } {
      null
    } ifelse
  } {
    dup type /stringtype eq {
      Trailer /Root oget /Names knownoget {
	/Dests knownoget {
	  exch nameoget
	} {
	  pop null
	} ifelse
      } {
	pop null
      } ifelse
    } if
  } ifelse
} bind def
/linkdest {		% <link|outline> linkdest
			%   ([/Page <n>] /View <view> | ) <link|outline>
  dup /Dest knownoget
    { resolvedest
      dup type /dicttype eq { /D knownoget not { null } if } if
      dup null eq
       { pop }
       { dup 0 oget
	 dup null eq
	  { pop }
	  { dup type /integertype ne { pdfpagenumber } if
	    /Page exch 4 -2 roll
	  }
	 ifelse
	 dup length 1 sub 1 exch getinterval /View exch 3 -1 roll
       }
      ifelse
    }
   if
} bind def
% <pagedict> mark ... -proc- -
/namedactions 8 dict dup begin
  /FirstPage {
    /Page 1 3 -1 roll
  } def
  /LastPage {
    counttomark 2 add index pdfpagecount /Page exch 3 -1 roll
  } def
  /NextPage {
    counttomark 2 add index pdfpagenumber 1 add /Page exch 3 -1 roll
  } def
  /PrevPage {
    counttomark 2 add index pdfpagenumber 1 sub /Page exch 3 -1 roll
  } def
end readonly def
% <pagedict> <annotdict> -proc- -
/annottypes 5 dict dup begin
  /Text {
    mark exch
     { /Rect /Open /Contents }
     { 2 copy knownoget { 3 -1 roll } { pop } ifelse }
    forall pop /ANN pdfmark
  } bind def
  /Link {
    mark exch
     { /Rect /Border }
     { 2 copy knownoget { 3 -1 roll } { pop } ifelse }
    forall dup /A knownoget {
      dup /URI known {
        /A mark 3 2 roll    % <<>> /A [ <<action>>
        { oforce } forall
        .dicttomark
        3 2 roll
      } {
        dup /D knownoget {
	  exch pop exch dup length dict copy dup /Dest 4 -1 roll put
        } {
	  /N knownoget {		% Assume /S /Named
	     namedactions exch .knownget { exec } if
	  } if
        } ifelse
      } ifelse
    } if
    linkdest pop /LNK pdfmark
  } bind def
end readonly def

/pdfshowpage		% <pagedict> pdfshowpage -
 { dup /Page exch store
   pdfshowpage_init 
   pdfshowpage_setpage 
   save /PDFSave exch store
   (before exec) VMDEBUG
     pdfshowpage_finish
   (after exec) VMDEBUG
   PDFSave restore
 } bind def

/pdfpagecontents	% <pagedict> pdfpagecontents <contents>
 { } bind def

/pdfshowpage_init 	% <pagedict> pdfshowpage_init <pagedict>
 { /DSCPageCount DSCPageCount 1 add store
 } bind def

/.pdfshowpage_Install {	% <pagedict> [<prevproc>] .pdfshowpage_Install -
  exch
	% We would like to clip to the CropBox here, but the subsequent
	% initgraphics would override it.  Instead, we have to handle it
	% in graphicsbeginpage.
  dup /MediaBox pget {
    dup 0 get neg exch 1 get neg translate
  } if
  pop 0 get exec
} bind def

/pdfshowpage_setpage {	% <pagedict> pdfshowpage_setpage <pagedict>
  4 dict begin		% for setpagedevice
	% Stack: pagedict
  currentpagedevice /Orientation 2 index /Rotate pget not { 0 } if 90 idiv
	% Rotate specifies *clockwise* rotation!
    neg 3 and def
	% Stack: pagedict currentpagedict
  1 index /MediaBox pget {
			% Set the page size.
    boxrect 2 array astore /PageSize exch def pop pop
  } if
  dup /Install .knownget {
			% Don't let the Install procedure get more deeply
			% nested after every page.
      dup type dup /arraytype eq exch /packedarraytype eq or {
	dup length 4 eq {
	  dup 2 get /.pdfshowpage_Install load eq {
	    1 get 0 get	% previous procedure
	  } if
	} if
      } if
  } {
    { }
  } ifelse 1 array astore
  2 index exch /.pdfshowpage_Install load /exec load
  4 packedarray cvx
	% Stack: pagedict currentpagedict installproc
  /Install exch def
	% Stack: pagedict currentpagedict
  pop currentdict end setpagedevice
} bind def

/pdfshowpage_finish {	% <pagedict> pdfshowpage_finish -

  .writepdfmarks {

	% Copy the crop box.
    dup /CropBox knownoget {
	% If the page has been rotated, rotate the CropBox.
      mark /CropBox 3 -1 roll
      3 index /Rotate pget {
	90 idiv 1 and 0 ne {
	  aload pop 4 -2 roll exch 4 2 roll exch 4 array astore
	} if
      } if
      /PAGE pdfmark
    } if

	% Copy annotations and links.
    dup /Annots knownoget {
      0 1 2 index length 1 sub
       { 1 index exch oget
         dup /Subtype oget annottypes exch .knownget { exec } { pop } ifelse
       }
      for pop
    } if

  } if		% end .writepdfmarks

	% Display the actual page contents.
   6 dict begin
   /BXlevel 0 def
   /BGDefault currentblackgeneration def
   /UCRDefault currentundercolorremoval def
	%****** DOESN'T HANDLE COLOR TRANSFER YET ******
   /TRDefault currenttransfer def
  matrix currentmatrix 2 dict
  2 index /CropBox knownoget {
    boxrect 4 array astore 1 index /ClipRect 3 -1 roll put
  } if
  dictbeginpage /DefaultMatrix 1 index store setmatrix
  dup		  % for showing annotations below
  count /pdfemptycount exch store
  gsave
	% If the page uses any transparency features, show it within
	% a transparency group.
  PDFversion 1.4 lt {
    showpagecontents
  } {
    dup pageusestransparency {
      % Show the page within a PDF 1.4 device filter.
      0 .pushpdf14devicefilter {
	% If the page has a Group, enclose contents in transparency group.
        % (Adobe Tech Note 5407, sec 9.2)
        dup /Group knownoget {
	  1 index /CropBox knownoget not {
	    1 index /MediaBox oget
	  } if .beginformgroup {
	    showpagecontents
	  } .internalstopped {
	    .discardtransparencygroup stop
	  } if .endtransparencygroup
        } {
	  showpagecontents
        } ifelse
      } .internalstopped {
	% todo: discard
	.popdevicefilter stop
      } if .popdevicefilter
    } {
      showpagecontents
    } ifelse
  } ifelse
  grestore
   % todo: mixing drawing ops outside the device filter could cause
   % problems, for example with the pnga device.
   /Annots knownoget { { oforce drawannot } forall } if
   endpage
   end			% scratch dict
} bind def
/showpagecontents {	% <pagedict> showpagecontents -
  /Contents knownoget not { 0 array } if
  dup type /arraytype ne { 1 array astore } if {
    oforce false resolvestream pdfopdict .pdfrun
  } forall
} bind def
/processcolorspace {	% - processcolorspace <colorspace>
	% The following is per the PLRM3.
  currentdevice 1 dict dup /ProcessColorModel dup put .getdeviceparams
  exch pop exch pop
  dup type /nametype ne { cvn } if
  dup { setcolorspace } .internalstopped { pop /DeviceRGB } if
} bind def

% ------ Transparency support ------ %

% Determine whether a page might invoke any transparency features:
%	- Group in the page dictionary
%	- Non-default ca, CA, or SMask in an ExtGState
%	- Form XObject with Group
%	- Image XObject with SMask
% ****** DO WE NEED TO LOOK IN RESOURCE DICTS OF OTHER CONTENT STREAMS? ******
/pageusestransparency {		% <pagedict> pageusestransparency <bool>
  PDFversion 1.4 lt {
    pop false
  } {
    dup /Group known {
      pop true
    } {
      false exch {
	dup resourceusestransparency { pop not exit } if
	/Parent knownoget not { exit } if
      } loop
    } ifelse
  } ifelse
} bind def
% Check the Resources of a page or Form.
/resourceusestransparency {	% <dict> resourceusestransparency <bool>
  {	% Use loop to provide an exitable context.
    /Resources knownoget not { 0 dict } if
    dup /ExtGState knownoget {
      false exch {
	exch pop oforce
	dup /ca knownoget { 1 ne { pop not exit } if } if
	dup /CA knownoget { 1 ne { pop not exit } if } if
	dup /SMask knownoget { /None ne { pop not exit } if } if
	pop
      } forall { pop true exit } if
    } if
    dup /XObject knownoget {
      false exch {
	exch pop oforce dup /Subtype get
	dup /Image eq { 1 index /SMask known { pop pop not exit } if } if
	/Form eq {
	  dup /Group known { pop not exit } if
	  resourceusestransparency { not exit } if
	} {
	  pop
	} ifelse
      } forall { pop true exit } if
    } if
    pop false exit
  } loop
} bind def

end			% pdfdict
.setglobal
                               S p i r a l   G y r a e s t u x e   F a c e p l a t e i p t                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    %    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdf_ops.ps,v 1.17.2.2 2002/02/22 19:45:55 ray Exp $
% Definitions for most of the PDF operators.

.currentglobal true .setglobal

% Define pdfmark.  Don't allow it to be bound in.
% Also don't define it in systemdict, because this leads some Adobe code
% to think this interpreter is a distiller.
% (If this interpreter really is a distiller, don't do this.)
systemdict /pdfmark known not
 { userdict /pdfmark { cleartomark } bind put } if

userdict /GS_PDF_ProcSet 127 dict dup begin

% ---------------- Abbreviations ---------------- %

/bdef { bind def } bind def

% ---------------- Graphics state stack ---------------- %

% PDF adds a number of parameters to the graphics state.
% We implement this by pushing and popping a dictionary
% each time we do a PDF gsave or grestore.
% The keys in this dictionary are as follows:
%	self			% identifies the dictionary as one of ours
%	ClipRect		% (optional)
%	Show
%	TextSaveMatrix		% matrix at time of BT (iff within BT/ET)
% (The following correspond directly to PDF state parameters.)
%	AlphaIsShape
%	FillConstantAlpha
%	FillColor
%	FillColorSpace
%	FillOverprint
%	SoftMask
%	StrokeConstantAlpha
%	StrokeColor
%	StrokeColorSpace
%	StrokeOverprint
%	TextSpacing
%	TextHScaling
%	Leading
%	TextFont
%	TextLineMatrix
%	TextMatrix
%	TextRise
%	TextRenderingMode
%	WordSpacing

/nodict 1 dict def
nodict /self { //nodict } executeonly put
nodict readonly pop

/dictbeginpage {	% <initialdict> dictbeginpage -
  //nodict 20 dict .copydict begin { def } forall
  graphicsbeginpage textbeginpage
} bdef
/endpage {	% - endpage -
  showpage end
} bdef

/graphicsbeginpage {
  initgraphics
  currentdict /ClipRect .knownget { aload pop rectclip } if
  0 g  0 G  false op  false OP  0 OPM
  1 ca  1 CA  null SMask  false AIS  /Compatible BM  true TK
} bdef

/gput		% <value> <key> gput -
 { exch currentdict //nodict eq { /self dup load end 5 dict begin def } if
		% If we're in a Level 1 system, we need to grow the
		% dictionary explicitly.
   currentdict length currentdict maxlength ge %eq
    { currentdict dup length 3 mul 2 idiv 1 add dict .copydict end begin 
    }
   if def
 } bdef

/q {
  gsave //nodict begin
} bdef
% Some PDF files have excess Q operators!
/Q {
  currentdict /self .knownget { exec //nodict eq { end grestore } if } if
} bdef

% ---------------- Color setting ---------------- %

/fcput		% <color> <colorspace> fcput -
 { /FillColorSpace gput /FillColor gput
 } bdef
/scput		% <color> <colorspace> scput -
 { /StrokeColorSpace gput /StrokeColor gput
 } bdef

/csdevgray [/DeviceGray] readonly def
/csdevrgb [/DeviceRGB] readonly def
/csdevcmyk [/DeviceCMYK] readonly def
/cspattern [/Pattern] readonly def
/nullpattern1 mark
   /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 0 0]
   /XStep 1 /YStep 1 /PaintProc { }
.dicttomark readonly def
/nullpattern2 nullpattern1 dup length dict copy readonly def

% Each entry in the color space dictionary is a procedure of the form
%	<cspace> -proc- <cspace> <initial-color>
/CSdict mark
  /DeviceGray { pop //csdevgray 0 } bind
  /DeviceRGB { pop //csdevrgb [0 0 0] cvx } bind
  /DeviceCMYK { pop //csdevcmyk [0 0 0 1] cvx } bind
  /CIEBasedA { 0 } bind
  /CIEBasedABC { [0 0 0] cvx } bind
  /ICCBased { [ 1 index 1 oget /N get { 0 } repeat ] cvx } bind
  /Separation { 1 } bind
  /DeviceN {	% What is the correct value??
    [ 1 index 1 get length { 1 } repeat ] cvx
  } bind
  /Indexed { 0 } bind
  /Pattern {
    dup type /nametype eq 1 index length 1 eq or {
      pop //cspattern //nullpattern1 matrix makepattern
    } {
      //nullpattern2 matrix makepattern 1 index 1 get csset
		% Stack: patternspace nullpattern basecolor basespace
      pop [ 3 1 roll dup type /arraytype eq { aload pop } if
      counttomark -1 roll ] cvx
    } ifelse
  } bind
.dicttomark readonly def
/csset			% <cspace> csset <color> <cspace>
 { dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch
 } bdef

/g { //csdevgray fcput } bdef
/G { //csdevgray scput } bdef
/rg { 3 array astore cvx //csdevrgb fcput } bdef
/RG { 3 array astore cvx //csdevrgb scput } bdef
/k { 4 array astore cvx //csdevcmyk fcput } bdef
/K { 4 array astore cvx //csdevcmyk scput } bdef
/cs { csset fcput } bdef
/CS { csset scput } bdef
/ri { pop } bdef
% We have to break up sc according to the number of operands.
/sc1 { /FillColor gput } bdef
/SC1 { /StrokeColor gput } bdef
% We have to avoid storing into a color array associated with an outer
% gsave level, so we do a kind of "copy on write".
/sc* {
  currentdict /FillColor .knownget {
    astore pop
  } {
    /FillColor load length array astore cvx /FillColor gput
  } ifelse
} bdef
/SC* {
  currentdict /StrokeColor .knownget {
    astore pop
  } {
    /StrokeColor load length array astore cvx /StrokeColor gput
  } ifelse
} bdef

% ---------------- Overprint/transparency setting ---------------- %

/op { /FillOverprint gput } bdef
/OP { /StrokeOverprint gput } bdef
/OPM {
  /.setoverprintmode where { pop .setoverprintmode } { pop } ifelse
} bdef
/ca { /FillConstantAlpha gput } bdef
/CA { /StrokeConstantAlpha gput } bdef
/SMask { /SoftMask gput } bdef
/AIS { /AlphaIsShape gput } bdef
/BM {
  /.setblendmode where {
    pop [ exch dup type /nametype ne { aload pop } if /Normal ] {
      { .setblendmode } .internalstopped not { exit } if pop
    } forall
  } {
    pop
  } ifelse
} bdef
/TK {
  /.settextknockout where { pop .settextknockout } { pop } ifelse
} bdef

% ---------------- Color installation ---------------- %

% Establish a given color (and color space) as current.
/.settransparencyparams {	% <alpha> <smask> .settransparencyparams -
  /.begintransparencymask where {
    pop AlphaIsShape {
      1 .setopacityalpha 0 .inittransparencymask exch .setshapealpha 1
    } {
      1 .setshapealpha 1 .inittransparencymask exch .setopacityalpha 0
    } ifelse
	% Set the soft mask by rendering the XObject.  Doing this every time
	% is obviously very inefficient; we'll improve it later.
    .settransparencymask    
  } {
    pop pop
  } ifelse
} bdef
/.settransparencymask {		% <paramdict> <masknum> .settransparencymask -
  exch dup null eq {
    pop .inittransparencymask
  } {
    dup /Draw get exec
  } ifelse
} bdef
% (Non-mask) images must execute setfillblend.
/setfillblend {
  FillOverprint setoverprint
  FillConstantAlpha SoftMask .settransparencyparams
} def
/setfillstate {
  FillColor FillColorSpace setgcolor setfillblend
} def
/setstrokestate {
  StrokeColor StrokeColorSpace setgcolor StrokeOverprint setoverprint
  StrokeConstantAlpha SoftMask .settransparencyparams
} def
/Cdict 15 dict dup begin	% <color...> <colorspace> -proc- -
  /DeviceGray { pop setgray } bdef
  /DeviceRGB { pop setrgbcolor } bdef
  /DeviceCMYK { pop setcmykcolor } bdef
  /CIEBasedA
   { dup currentcolorspace eq { pop } { setcolorspace } ifelse setcolor } bdef
  /CIEBasedABC /CIEBasedA load def
  /CIEBasedDEF /CIEBasedA load def
  /CIEBasedDEFG /CIEBasedA load def
  /ICCBased /CIEBasedA load def
  /Separation /CIEBasedA load def
  /DeviceN /CIEBasedA load def
  /Indexed /CIEBasedA load def
  /Pattern
   { dup currentcolorspace eq { pop } { setcolorspace } ifelse
     dup /Matrix .knownget not { matrix } if
     gsave DefaultMatrix setmatrix makepattern grestore setcolor
   } bdef
end def
/setgcolor	% (null | <color...>) <colorspace> setgcolor -
 { 1 index null eq
    { pop pop }
    { dup 0 get //Cdict exch get exec }
   ifelse
 } bdef
/fsexec		% <fillop|strokeop> fsexec -
 {		% Preserve the current point, if any.
    { currentpoint } stopped
    { $error /newerror false put   cvx exec }
    { 3 -1 roll cvx exec moveto }
   ifelse
 } bdef

% ---------------- Path painting and clipping ---------------- %

/S { setstrokestate /stroke fsexec } bdef
/f { setfillstate /fill fsexec } bdef
/f* { setfillstate /eofill fsexec } bdef
/n { newpath } bdef		% don't allow n to get bound in
/s { closepath S } bdef
/B { gsave setfillstate fill grestore S } bdef
/b { closepath B } bdef
/B* { gsave setfillstate eofill grestore S } bdef
/b* { closepath B* } bdef

% Clipping:

/Wdict 4 dict dup begin
/S { gsave setstrokestate stroke grestore n } bdef
/f { gsave setfillstate fill grestore n } bdef
/f* { gsave setfillstate eofill grestore n } bdef
/n { end clip newpath } bdef
end readonly def
/W { //Wdict begin } bdef
/W*dict 4 dict dup begin
Wdict { def } forall
/n { end eoclip newpath } bdef
end readonly def
/W* { //W*dict begin } bdef

% ---------------- Text control ---------------- %

/textbeginpage
 { /TextSpacing 0 def		% 0 Tc
   /TextLeading 0 def		% 0 TL
   /TextRenderingMode 0 def	% 0 Tr
   /TextRise 0 def		% 0 Ts
   /WordSpacing 0 def		% 0 Tw
   /TextHScaling 1.0 def	% 100 Tz
   /TextFont null def
   /Show { showfirst } def
 } bdef

% Contrary to the statement in the PDF manual, BT and ET *can* be nested,
% if the CharProc for a Type 3 font does a BT/ET itself.
% Since we always call the CharProc inside a q/Q, we simply ensure that
% the text state is saved and restored like the rest of the extended
% graphics state.

/settextmatrix {
  TextMatrix concat
  TextHScaling 1 ne { TextHScaling 1 scale } if
  TextRise 0 ne { 0 TextRise translate } if
  TextFont dup null eq { pop } { setfont } ifelse
} bdef
/settextstate {
	% The text state can be set even outside BT/ET.
  currentdict /TextSaveMatrix known {
    TextSaveMatrix setmatrix settextmatrix
  } if
} bdef
/settextposition {
		% Update the TextMatrix translation.
  gsave TextSaveMatrix setmatrix
  currentpoint TextMatrix 4 2 getinterval astore pop
		% We would like to do "grestore currentpoint translate"
		% here, but some PDF files set a singular text matrix
		% (0 0 0 0 <x> <y> Tm), so we can't do this.
  TextTempMatrix identmatrix setmatrix currentpoint
  grestore
  TextTempMatrix currentmatrix 4 2 getinterval astore pop
  TextTempMatrix setmatrix
} bdef

/BT {
  currentdict /TextLineMatrix .knownget
    { identmatrix pop TextMatrix identmatrix pop }
    { matrix /TextLineMatrix gput matrix /TextMatrix gput }
  ifelse
  { showfirst } /Show gput
  currentdict /TextSaveMatrix .knownget not {
    matrix dup /TextSaveMatrix gput
  } if currentmatrix pop settextmatrix
  matrix /TextTempMatrix gput		% see settextposition
} bdef
/ET {
  TextRenderingMode 4 ge { clip newpath } if
  TextSaveMatrix setmatrix
  currentdict /TextSaveMatrix undef
} bdef
/Tc { /TextSpacing gput { showfirst } /Show gput } bdef
/TL { /TextLeading gput } bdef
/Tr { /TextRenderingMode gput { showfirst } /Show gput } bdef
/Ts { /TextRise gput settextstate } bdef
/Tw { /WordSpacing gput { showfirst } /Show gput } bdef
/Tz { 100 div /TextHScaling gput settextstate} bdef

% ---------------- Font control ---------------- %

/Tf {		% <font> <scale> Tf -
  dup 1 eq { pop } { scalefont } ifelse
  /TextFont gput settextstate
} bdef

% Read a CFF font.
/FRD		% <resname> <file> FRD -
 { /FontSetInit /ProcSet findresource begin true ReadData
 } bdef

% Copy a font, removing its FID.  If changed is true, also remove
% the UniqueID and XUID, if any.  If the original dictionary doesn't have
% the keys being removed, don't copy it.
/.copyfontdict		% <font> <changed> .copyfontdict <dict>
 { 1 index /FID known
   1 index { 2 index /UniqueID known or 2 index /XUID known or } if
    {		% We add 1 to the length just in case the original
		% didn't have a FID.
      exch dup length 1 add dict exch
       {		% Stack: changed newfont key value
	 1 index /FID eq 4 index
	  { 2 index /UniqueID eq or 2 index /XUID eq or }
	 if not { 3 copy put } if pop pop
       }
      forall exch
    }
   if pop
 } bdef

% Insert a new Encoding or Metrics into a font if necessary.
% Return a possibly updated font, and a flag to indicate whether
% the font was actually copied.
/.updatefontmetrics {	% <font> <Metrics|null> .updatefontmetrics
			%   <font'> <copied>
  dup null ne {
    exch true .copyfontdict dup /Metrics 4 -1 roll put true
  } {
    pop false
  } ifelse
} bdef
/.updatefontencoding {	% <font> <Encoding|null> .updatefontencoding
			%   <font'> <copied>
  dup null ne { dup 2 index /Encoding get ne } { false } ifelse {
    exch false .copyfontdict dup /Encoding 4 -1 roll put true
  } {
    pop false
  } ifelse
} bdef
/.updatefont {		% <font> <Encoding|null> <Metrics|null> .updatefont
			%   <font'> <copied>
  3 -1 roll exch .updatefontmetrics
			% Stack: enc|null font' copied
  3 1 roll exch .updatefontencoding 3 -1 roll or
} bdef

% ---------------- Text positioning ---------------- %

/Td {
  TextLineMatrix transform TextLineMatrix 4 2 getinterval astore pop
  TextLineMatrix TextMatrix copy pop settextstate
} bdef
/TD { dup neg /TextLeading gput Td } bdef
/T* { 0 TextLeading neg Td } bdef
/Tm {
  TextLineMatrix astore TextMatrix copy pop settextstate
} bdef

% ---------------- Text painting ---------------- %

/Vexch {
  rootfont /WMode .knownget { 1 eq { exch } if } if
} bind def

/textrenderingprocs [		% (0 is handled specially)
	% Painting-only modes
   { tf } { tS } { tB } { tn }
	% Clipping modes
   { gsave tf grestore tW }
   { gsave tS grestore tW }
   { gsave tB grestore tW }
   { tW }
] readonly def
/setshowstate
 { WordSpacing 0 eq TextSpacing 0 eq and
    { TextRenderingMode 0 eq
       { { setfillstate show } }
       { { false charpath textrenderingprocs TextRenderingMode get exec } }
      ifelse
    }
    { TextRenderingMode 0 eq
       { WordSpacing 0 eq
          { { setfillstate TextSpacing 0 Vexch 3 -1 roll ashow } }
	  { TextSpacing 0 eq
            { { setfillstate WordSpacing 0 Vexch 32 4 -1 roll widthshow } }
            { { setfillstate WordSpacing 0 Vexch 32
                 TextSpacing 0 Vexch 6 -1 roll awidthshow } }
	    ifelse
	  }
	 ifelse
       }
       { { WordSpacing TextSpacing
			% Implement the combination of t3 and false charpath.
			% Note that we must use cshow for this, because we
			% can't parse multi-byte strings any other way.
			% Stack: string xword xchar
	    { pop pop (x) dup 0 3 index put false charpath
			% Stack: xword xchar ccode
             3 copy 32 eq { add } { exch pop } ifelse 0 Vexch rmoveto pop
	    }
	   4 -1 roll cshow pop pop
	   textrenderingprocs TextRenderingMode get exec
	 }
       }
      ifelse
    }
   ifelse /Show gput
 } bdef
/showfirst { setshowstate Show } def

/Tj {
  0 0 moveto Show settextposition
} bdef
/' { T* Tj } bdef
/" { exch Tc exch Tw T* Tj } bdef
/TJ {
  0 0 moveto {
    dup type /stringtype eq {
      Show
    } { -1000 div
      currentfont /ScaleMatrix .knownget { 0 get mul } if
      0 Vexch rmoveto
    } ifelse
  } forall settextposition
} bdef

/tf { setfillstate currentpoint fill moveto } bdef
/tn { currentpoint newpath moveto } bdef
% For stroking characters, temporarily restore the graphics CTM so that
% the line width will be transformed properly.
/Tmatrix matrix def
/tS
 { setstrokestate
   currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix stroke
   setmatrix moveto
 } bdef
/tB { gsave tf grestore tS } bdef
% This does the wrong thing if there have been multiple text operations
% within a single BT/ET pair, but it's a start.
/tW { } bdef

end readonly put		% GS_PDF_ProcSet

.setglobal
@J.fJ.g  Hl"N^X  a-@B/. /.N _)H#J#f&Hz n /( Hx NTJl#g                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %   Copyright (C) 1996-1998 Geoffrey Keating. 
%	Copyright (C) 2001 Artifex Software, Inc.
% This file may be freely distributed with or without modifications,
% so long as modified versions are marked as such and copyright notices are
% not removed.

% $Id: pdf_sec.ps,v 1.5.2.1 2002/04/02 13:57:27 mpsuzuki Exp $
% Implementation of security hooks for PDF reader.

% This file contains the procedures that have to take encryption into
% account when reading a PDF file. It replaces the stub version of this
% file that is shipped with GhostScript. It requires GhostScript 7.01
% or later.

% Documentation for using this file is available at
% http://www.ozemail.com.au/%7Egeoffk/pdfencrypt/

% Modified by Alex Cherepanov to work with GS 6.60 and higher.
% New versions of GS require explicit checks for /true , /false, and /null
% in .decpdfrun . This fix is backward-compatible.

% Modified by Raph Levien and Ralph Giles to use the new C
% implementations of md5 and arcfour in ghostscript 7.01, and to
% be compatible with PDF 1.4 128-bit encryption.

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal
/pdfdict where { pop } { /pdfdict 100 dict def } ifelse
pdfdict begin

% Older ghostscript versions do not have .pdftoken, so we use 'token' instead.
/.pdftoken where { pop } { /.pdftoken /token load def } ifelse

% take a stream and arc4 decrypt it.
% <stream> <key> arc4decodefilter <stream>
/arc4decodefilter {
  1 dict begin
  /Key exch def
  currentdict end /ArcfourDecode filter
} bind def

% <ciphertext> <key> arc4decode <plaintext>
/arc4decode {
  %(key: ) print dup == (ct: ) print 1 index ==
  1 index length 0 eq {
    pop
  } {
    1 index length string 3 1 roll arc4decodefilter exch readstring pop
  } ifelse
} bind def

/md5 {
  16 string dup /MD5Encode filter dup 4 3 roll writestring closefile
} bind def

/pdf_padding_string
   <28bf4e5e4e758a41 64004e56fffa0108
    2e2e00b6d0683e80 2f0ca9fe6453697a>
def

% Pad a key out to 32 bytes.
/pdf_pad_key {		% <key> pdf_pad_key <padded key>
  dup length 32 gt { 0 32 getinterval } if
  pdf_padding_string
  0 32 3 index length sub getinterval
  concatstrings
} bind def

/pdf_xorbytes {      % <iter-num> <key> pdf_xorbytes <xored-key>
  dup length dup string
  exch 1 sub 0 1 3 2 roll {
    % <iter-num> <key> <new-key> <byte-num>
    dup 3 index exch get 4 index xor
    % <iter-num> <key> <new-key> <byte-num> <byte>
    3 copy put pop pop
  } for
  3 1 roll pop pop
} bind def

% Get length of encryption key in bytes
/pdf_key_length {    % pdf_key_length <key_length>
  Trailer /Encrypt oget /Length knownoget { -3 bitshift } { 5 } ifelse
} bind def

% Algorithm 3.2
/pdf_compute_encryption_key {  % <password> pdf_compute_encryption_key <key>
  % Step 1.
  pdf_pad_key

  % Step 2, 3.
  Trailer /Encrypt oget dup /O oget
  % <padded-key> <encrypt> <O>

  % Step 4.
  exch /P oget 4 string exch
  2 copy 255 and 0 exch put
  2 copy -8 bitshift 255 and 1 exch put
  2 copy -16 bitshift 255 and 2 exch put
  2 copy -24 bitshift 255 and 3 exch put pop
  % <padded-key> <O> <P>

  % Step 5.
  Trailer /ID oget 0 oget
  3 { concatstrings } repeat md5

  % Step 6.
  Trailer /Encrypt oget /R oget 3 eq {
     50 { md5 } repeat
  } if

  % Step 7.
  0 pdf_key_length getinterval
} bind def

% Algorithm 3.4
/pdf_gen_user_password_R2 { % <filekey> pdf_gen_user_password_R2 <U>

  % Step 2.
  pdf_padding_string exch arc4decode
} bind def

% Algorithm 3.5
/pdf_gen_user_password_R3 { % <filekey> pdf_gen_user_password_R3 <U>

  % Step 2.
  pdf_padding_string

  % Step 3.
  Trailer /ID oget 0 oget
  concatstrings md5

  % Step 4.
  1 index arc4decode

  % Step 5.
  1 1 19 {
    2 index pdf_xorbytes arc4decode
  } for
  exch pop

} bind def

/pdf_gen_user_password { % <password> pdf_gen_user_password <filekey> <U>
  % common Step 1 of Algorithms 3.4 and 3.5.
  pdf_compute_encryption_key dup

  Trailer /Encrypt oget

  /R oget dup 2 eq {
    pop pdf_gen_user_password_R2
  } {
    dup 3 eq {
      pop pdf_gen_user_password_R3
    } {
      (****This file uses an unknown standard security handler revision: )
      print == flush
      /pdf_check_user_password cvx /undefined signalerror
    } ifelse
  } ifelse
} bind def

% Algorithm 3.6
/pdf_check_user_password { % <password> pdf_check_user_password <filekey> true
                           % <password> pdf_check_user_password false
  pdf_gen_user_password

  Trailer /Encrypt oget /U oget

  0 2 index length getinterval eq {
    true
  } {
    pop false
  } ifelse
} bind def

% Compute an owner key, ie the result of step 4 of Algorithm 3.3
/pdf_owner_key % <password> pdf_owner_key <owner-key>
{
  % Step 1.
  pdf_pad_key

  % Step 2.
  md5

  % 3.3 Step 3.
  Trailer /Encrypt oget /R oget 3 eq {
    50 { md5 } repeat
  } if

  % Step 4.
  0 pdf_key_length getinterval
} bind def

% Algorithm 3.7
/pdf_check_owner_password { % <password> pdf_check_owner_password <filekey> true
                            % <password> pdf_check_owner_password false
  % Step 1.
  pdf_owner_key

  % Step 2.
  Trailer /Encrypt oget dup /O oget 2 index arc4decode
  % <encryption-key> <encrypt-dict> <decrypted-O>

  % Step 3.
  exch /R oget 3 eq {
    1 1 19 {
      2 index pdf_xorbytes arc4decode
    } for
  } if
  exch pop
  % <result-of-step-3>

  pdf_check_user_password
} bind def

% Process the encryption information in the Trailer.
/pdf_process_Encrypt {
  Trailer /Encrypt oget
  /Filter oget /Standard eq not {
    (****This file uses an unknown security handler.\n) print flush
    /pdf_process_Encrypt cvx /undefined signalerror
  } if
  () pdf_check_user_password
  {
    /FileKey exch def
  } {
    /PDFPassword where {
       pop PDFPassword pdf_check_user_password
       {
         /FileKey exch def
       } {
         PDFPassword pdf_check_owner_password
         {
           /FileKey exch def
         } {
           (****Password did not work.\n) print flush
	   /pdf_process_Encrypt cvx /invalidfileaccess signalerror
         } ifelse
       } ifelse
    } {
      (****This file requires a password for access.\n) print flush
      /pdf_process_Encrypt cvx /invalidfileaccess signalerror
    } ifelse
  } ifelse

%   Trailer /Encrypt oget /P oget 4 and 0 eq #? and
%    { (****This owner of this file has requested you do not print it.\n)
%	  print flush
%      /pdf_process_Encrypt cvx /invalidfileaccess signalerror
%    }
%   if
} bind def

% Calculate the key used to decrypt an object (to pass to .decpdfrun or
% put into a stream dictionary).
/computeobjkey	% <object#> <generation#> computeobjkey <keystring>
{
  exch
  FileKey length 5 add string
  dup 0 FileKey putinterval
  exch
		% stack:  gen# string obj#
    2 copy 255 and FileKey length exch put
    2 copy -8 bitshift 255 and FileKey length 1 add exch put
    2 copy -16 bitshift 255 and FileKey length 2 add exch put
  pop exch
    2 copy 255 and FileKey length 3 add exch put
    2 copy -8 bitshift 255 and FileKey length 4 add exch put
  pop md5 0 FileKey length 5 add 2 index length .min getinterval
} bind def

% As .pdfrun, but decrypt strings with key <key>.
/.decpdfrun			% <file> <keystring> <opdict> .decpdfrun -
 {	% Construct a procedure with the file, opdict and key bound into it.
   2 index cvlit mark mark 5 2 roll
    { .pdftoken not { (%%EOF) cvn cvx } if
      dup xcheck
       { DEBUG { dup == flush } if
	 3 -1 roll pop
	 2 copy .knownget
	  { exch pop exch pop exec
          }
	  { exch pop
            dup /true eq
              { pop //true
              }
              { dup /false eq
                  { pop //false 
                  }
                  { dup /null eq
                      { pop //null
                      }
                      { (%stderr) (w) file
	                dup (****************Unknown operator: ) writestring
	                dup 3 -1 roll .writecvs dup (\n) writestring flushfile
                      }
                    ifelse
                  }
                ifelse
              }
            ifelse
	  }
	 ifelse
       }
       { exch pop DEBUG { dup ==only ( ) print flush } if
	 dup type /stringtype eq
	  { 1 index arc4decode
	    DEBUG { (%Decrypted: ) print dup == flush } if
	  }
	 if
	 exch pop
       }
      ifelse
    }
   aload pop .packtomark cvx
   /loop cvx 2 packedarray cvx
    { stopped /PDFsource } aload pop
   PDFsource
    { store { stop } if } aload pop .packtomark cvx 
   /PDFsource 3 -1 roll store exec
 } bind def

% Run the code to resolve an object reference.
/pdf_run_resolve
 { /FileKey where
    { pop
      2 copy computeobjkey dup 4 1 roll
      PDFfile exch resolveopdict .decpdfrun
      dup dup dup 5 2 roll
	% stack: object object key object object
      xcheck exch type /dicttype eq and
       { /StreamKey exch put }
       { pop pop }
      ifelse
    }
    { PDFfile resolveopdict .pdfrun }
   ifelse
 } bind def

% Prefix a decryption filter to a stream if needed.
% Stack: readdata? dict parms file/string filternames
% (both before and after).
/pdf_decrypt_stream
 { 3 index /StreamKey known
   {
      exch 
	% Stack: readdata? dict parms filternames file/string
      3 index /Length oget
      dup 0 eq {
	% Handle Length=0 case specially to avoid SubFileDecode semantics
        pop pop ()
      } {
        () /SubFileDecode filter
      } ifelse
      3 index /StreamKey get arc4decodefilter
      exch
   } if
 } bind def

end			% pdfdict
.setglobal
uTRYDESIGNV/B.HnԨ?< 
p9@@p9@A2?< N+BT @ 9@@l @f?< N+(T @ 9@A2 n CA""HlAN*|X0,AؐlA=@A)H@A)HA6?< N*TR@9@@?< N*TR@9@A4Bn` ~ `  ?.N*T @ H-@0n  =@? N*TT@=@0n  ? N*~TT@=@-l@=l@0HA@!n 0HA@ 0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 2000, 2001 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdfopt.ps,v 1.10.2.2 2002/04/02 13:57:27 mpsuzuki Exp $
% PDF linearizer ("optimizer").

.currentglobal true .setglobal
/pdfoptdict 200 dict def
pdfoptdict begin

% This linearizer is designed for simplicity, not for performance.
% See the main program (the last procedure in the file) for comments
% describing the main processing sequence.

% ---------------- Utilities ---------------- %

% ------ Data structures ------ %

% Distinguish dictionaries, arrays, and everything else.
/ifdaelse {		% <obj> <dictproc> <arrayproc> <otherproc> ifdaelse -
  3 index type dup /dicttype eq {
    pop pop pop
  } {
    dup /arraytype ne exch /packedarraytype ne and {
      exch
    } if pop exch pop
  } ifelse exec
} bind def

% Implement dynamically growable arrays using a dictionary.
/darray {		% <size> darray <darray>
  dict
} bind def
/dadd {			% <darray> <value> dadd -
  1 index length exch put
} bind def
/daforall {		% <darray> <proc> daforall -
  /exch cvx /get cvx 3 -1 roll /exec cvx 5 packedarray cvx
  0 1 2 index 0 get length 1 sub 4 -1 roll for
} bind def
/dacontents {		% <darray> dacontents <array>
  [ exch { } daforall ]
} bind def
/dacontstring {		% <darray> dacontstring <string>
  0 1 index { exch pop length add } forall string
  dup /NullEncode filter
			% Stack: darray str filter
  3 -1 roll { 1 index exch writestring } daforall
  closefile
} bind def

% Force an object, mapping it if it is a reference.
/omforcenew {		% <obj> omforce <obj'> <notseen>
  dup oforce 2 copy eq { pop true } { exch 0 get omapnew exch pop } ifelse
} bind def
/omforce {		% <obj> omforce <obj'>
  omforcenew pop
} bind def
/omget {		% <dict|array> <key> omget <obj>
  get omforce
} bind def
% Visit an entire tree.
/omvisit {		% <obj> omvisit -
  omforcenew {
    { { omvisit omvisit } forall }
    { { omvisit } forall }
    { pop }
    ifdaelse
  } {
    pop
  } ifelse
} bind def
% Visit a tree, stopping at references to Page objects.
% (This is only needed for the OpenAction in the Catalog.)
/omvisitnopage {	% <obj> omvisitnopage -
  dup oforce dup type /dicttype eq {
    /Type .knownget { /Page eq } { false } ifelse
  } {
    pop false
  } ifelse {
    pop		% Page reference
  } {
    omforcenew {
      { { omvisitnopage omvisitnopage } forall }
      { { omvisitnopage } forall }
      { pop }
      ifdaelse
    } {
      pop
    } ifelse
  } ifelse
} bind def

% Collect the list of currently mapped object numbers, in order.
/omapped {		% - omapped <obj#s>
  RMap length array RMap {
    2 index 3 1 roll 1 sub exch put
  } forall
} bind def

% Collect the list of object numbers passed to omap by a procedure.
/visited {		% <proc> visited <obj#s>
  false currentomap 2 .execn
  omapped exch setomap
} bind def

% ------ Output ------ %

% Provide a framework for closure-based streams.
.currentglobal false .setglobal
userdict /clostreams 20 dict put	% stream -> [data endproc]
.setglobal
% Create a closure-based stream.
/clostream {		% <data> <proc> <endproc> clostream <stream>
  2 index 3 -1 roll /exec load 3 packedarray cvx
  /NullEncode filter
		% Stack: data endproc stream
  clostreams 1 index 5 -2 roll 2 array astore put
} bind def
% Close a closure-based stream.
/closend {		% <stream> closend <result>
  dup closefile clostreams exch
  2 copy get 3 1 roll undef aload pop exec
} bind def

% Implement in-memory output streams.
/msproc {		% <data> <more> <accum> msproc <scratch>
  3 -1 roll dadd { 100 string } { () } ifelse
} bind def
/mstream {		% - mstream <mstream>
  10 darray {msproc} {dacontstring} clostream
} bind def
/mcontents {		% <mstream> mcontents <string>
  closend
} bind def

% Implement a stream that only keeps track of its position.
% (All streams should do this, but the PLRM doesn't require it.)
/posbuf 100 string def
/posproc {		% <data> <more> <accum> posproc <scratch>
  0 2 copy get 5 -1 roll length add put
  pop //posbuf
} bind def
/postream {		% - postream <postream>
  [0] {posproc} {0 get} clostream
} bind def
/poslength {		% <postream> poslength <pos>
  closend
} bind def

% Implement streams with variable-bit-width data.
% Note that these are dictionary objects, not stream objects.
/bitstream {		% <stream> bitstream <bstream>
  4 dict begin /S exch def /N 8 def /B 0 def
  currentdict end
} bind def
/bitwrite {		% <bstream> <value> <width> bitwrite -
  PDEBUG { ( ) print 1 index =only (:) print dup = } if
  3 -1 roll begin
  N exch sub dup 0 ge {
    /N exch def N bitshift B add
  } {
    2 copy bitshift B add S exch write
			% Stack: value -left
    { 8 add dup 0 ge { exit } if
      2 copy bitshift 255 and S exch write
    } loop
    /N 1 index def bitshift 255 and
  } ifelse /B exch def
  end
} bind def
/bitflush {		% <bstream> bitflush -
  begin N 8 ne { S B write /B 0 def /N 8 def } if end
} bind def

% Capture OFile output on the temporary file, in memory, or just as a length.
/totemp {		% <proc> totemp <start> <end>
  TFile fileposition OFile
  /OFile TFile def 3 .execn
  /OFile exch def
  TFile fileposition
} bind def
/tomemory {		% <proc> tomemory <string>
  OFile /OFile mstream def 2 .execn
  OFile mcontents exch /OFile exch def
} bind def
/tolength {		% <proc> tolength <string>
  OFile /OFile postream def 2 .execn
  OFile poslength exch /OFile exch def
} bind def

% Copy a range of bytes from TFile to OFile.
/copyrange {		% <start> <end> copybytes -
  TFile 2 index setfileposition
  exch sub 1024 string exch {
		% Stack: buf left
    2 copy 1 index length .min 0 exch getinterval
    TFile exch readstring pop OFile exch writestring
    1 index length sub dup 0 le { exit } if
  } loop pop pop
} bind def

% Pad with blanks to a specified position.
/padto {		% <pos> padto -
  OFile fileposition sub
  dup 0 lt {
    (ERROR: file position incorrect by ) print =
    /padto cvx /rangecheck signalerror
  } {
    { ( ) ows } repeat
  } ifelse
} bind def

% ---------------- Read objects into memory ---------------- %

/touch {		% <object> touch -
  {
    { touch touch } forall
  } {
    dup xcheck {
		% Executable array, must be an indirect object.
      dup 0 get resolved? { pop pop } { oforce touch } ifelse
    } {
      { touch } forall
    } ifelse
  } {
    pop
  } ifdaelse
} bind def

% ---------------- Replace references with referents ---------------- %

/replaceable? {		% <value> replaceable? <bool>
  dup type /integertype eq exch xcheck not and
} bind def
/replacement {		% <obj|ref> replacement <obj'>
  dup oforce dup replaceable? { exch } if pop
} bind def

/replacerefs {		% <object> replacerefs <object>
  {
    dup {
      2 index 2 index undef
      exch replacement exch replacement
      2 index 3 1 roll put
    } forall
  } {
    0 1 2 index length 1 sub {
      1 index exch 2 copy get replacement put
    } for
  } {
  } ifdaelse
} bind def

/replaceReferences {	% - replaceReferences -
  Objects { replacerefs pop } lforall
		% Delete replaced objects.
  0 1 Objects llength 1 sub {
    Objects 1 index lget replaceable? {
      PDEBUG { (Deleting ) print dup = } if
      Generations 1 index 0 lput
    } if pop
  } for
} bind def

% ---------------- Create new objects ---------------- %

/createObjects {	% [<obj>...] createObjects <firstobj#>
  Objects llength dup
  dup 3 index length add growPDFobjects
		% Stack: objects objn objn
  3 1 roll exch {
    Objects 2 index 3 -1 roll lput
    Generations 1 index 1 lput
    1 add
  } forall pop
} bind def

% ---------------- Propagate attributes ---------------- %

/nopropattrs <<
	% Never propagate these.
  /Type dup /Kids dup /Count dup /Parent dup
	% Handle Resources specially.
  /Resources dup
>> def

% Merge Resources.
/mergeres {		% <fromdict> <todict> mergeres -
		% Values in todict take priority over fromdict.
  1 index /Resources .knownget {
    1 index /Resources .knownget {
		% Stack: fromdict todict fromres tores
      exch oforce exch oforce
		% todict's Resources may be shared, so make a copy.
      dup length dict .copydict
      exch {
		% Stack: fromdict todict tores' fromkey fromvalue
	2 index 2 index knownoget {
		% Stack: fromdict todict tores' fromkey fromvalue tovalue
	  exch oforce exch
		% ProcSet is an array, other types are dictionaries.
	  dup type /dicttype eq {
		% Dictionary, not ProcSet.
	    exch dup length 2 index length add dict .copydict .copydict
	  } {
		% Array or packed array, ProcSet.
		% Use dictionaries to do the merge.
	    dup length 2 index length add dict begin
	    exch { dup def } forall { dup def } forall
	    mark currentdict end { pop } forall .packtomark
	  } ifelse
	} if
	2 index 3 1 roll put
      } forall
    } if /Resources exch put pop
  } {
    pop pop
  } ifelse
} bind def

% Merge attributes other than Resources.
/mergeattrs {		% <fromdict> <todict> mergeattrs <fromdict> <todict>
		% Values in todict take priority over fromdict.
  1 index {
		% Stack: fromdict todict fromkey fromvalue
    //nopropattrs 2 index known {
      pop pop
    } {
      2 index 2 index known { pop pop } { 2 index 3 1 roll put } ifelse
    } ifelse
  } forall
} bind def

% Propagate attributes to a subtree.
/proppage {		% <attrs> <subtree> proppage -
		% We should be able to tell when we reach a leaf
		% by finding a Type unequal to /Pages.  Unfortunately,
		% some files distributed by Adobe lack the Type key
		% in some of the Pages nodes!  Instead, we check for Kids.
  dup /Kids knownoget {
		% Accumulate inherited values.
    3 1 roll
		% Stack: kids attrs pagesnode
    dup length dict .copydict mergeattrs
    dup 3 1 roll mergeres
    exch { oforce 1 index exch proppage } forall pop
  } {
		% Merge inherited values into the leaf.
    mergeattrs mergeres
  } ifelse
} bind def

% Propagate attributes to all pages.
/propagateAttributes {	% - propagateAttributes -
  0 dict Trailer /Root oget /Pages oget proppage
} bind def

% ---------------- Identify document-level objects ---------------- %

/identifyDocumentObjects {	% - identifyDocumentObjects <obj#s>
  {
    Trailer /Root omget
    dup /PageMode .knownget { omvisit } if
	% Don't allow omvisit to trace references to Page objects.
    dup /OpenAction .knownget { omvisitnopage } if
    Trailer /Encrypt .knownget { omvisit } if
    dup /Threads .knownget {
      omforce { omforce } forall
    } if
    dup /AcroForm .knownget { omvisit } if
    pop
  } visited
} bind def

% ---------------- Identify the objects of each page ---------------- %

/identifyfont {		% <fontref> identifyfont -
  omforce {
    exch /FontDescriptor eq {
      omforce dup /Flags .knownget { 32 and 0 ne } { false } ifelse
      exch {
	exch dup dup /FontFile eq exch /FontFile2 eq or
	exch /FontFile3 eq or 2 index and {
	  fontfiles exch dadd
	} {
	  omvisit
	} ifelse
      } forall pop
    } {
      omvisit
    } ifelse
  } forall
} bind def

/identifyPageObjects {	% <extra> <page#> identifyPageObjects <obj#s>
  pdffindpageref
  4 dict begin
  /images 10 darray def
  /fontfiles 10 darray def
  {
    omforce
		% Stack: extra page
		% Visit any extra objects if applicable.
    exch omvisit
		% Visit Annots, if any.
		% We don't try to defer the drawing information.
    dup /Annots .knownget { omvisit } if
		% Visit beads.
    dup /B .knownget { omvisit } if
		% Visit resources dictionaries.
    dup /Resources .knownget {
      omforce dup {
		% Visit the first-level Resource dictionaries.
	omforce pop pop
      } forall {
		% Visit the resources themselves.
		% Skip Image XObjects, and FontFile streams if the
		% FontDescriptor Flags have bit 6 set.
		% We don't try to visit the resources in the order in which
		% the Contents stream(s) reference(s) them.
	exch dup /XObject eq {
	  pop oforce {
	    dup oforce /Subtype get /Image eq {
	      images exch dadd
	    } {
	      omvisit
	    } ifelse pop
	  } forall
	} {
	  /Font eq {
	    oforce { identifyfont pop } forall
	  } {
	    oforce omvisit
	  } ifelse
	} ifelse
      } forall
    } if
		% Visit the Contents stream(s).
    dup /Contents .knownget { omvisit } if
		% Visit Image XObjects.  We don't try to visit them in
		% reference order.
    images { omvisit } daforall
		% Visit FontFile streams.  We don't try to visit them in
		% reference order.
    fontfiles { omvisit } daforall
    pop
  } visited end
} bind def

% Identify the objects of the first page.
/identifyFirstPageObjects {	% -identifyFirstPageObjects <obj#s>
  Trailer /Root oget null
  1 index /PageMode knownoget {
    /UseOutlines eq {
      1 index /Outlines knownoget { exch pop } if
    } if
  } if exch pop
  1 identifyPageObjects
} bind def

% Identify the non-shared objects of the other pages, and the shared objects.
/identifyOtherPageObjects {	% - identifyOtherPageObjects [<pageobj#s> ...]
				%   <sharedobj#s>
  4 dict begin
  /marks lstring Objects llength lgrowto def
		% Mark document-level and first page objectsw.
  [CatalogNs FirstPageNs] {
    { marks exch 255 lput } forall
  } forall
		% Collect objects of other pages and identify sharing.
  [ 2 1 pdfpagecount { null exch identifyPageObjects } for ]
  dup {
    { marks exch 2 copy lget 1 add 254 .min lput } forall
  } forall
  [ exch {
    [ exch {
      marks 1 index lget 1 ne { pop } if
    } forall ]
  } forall ]
  [ 1 1 marks llength 1 sub {
    marks 1 index lget dup 1 le exch 255 eq or { pop } if
  } for ]
  end
} bind def

% Identify objects not associated with any page.
/identifyNonPageObjects {	% - identifyNonPageObjects <obj#s>
  4 dict begin
  /marks lstring Objects llength lgrowto def
  [[[LPDictN PHSN] CatalogNs FirstPageNs SharedNs] OtherPageNs] {
    { { marks exch 1 lput } forall } forall
  } forall
	%****** PUT THESE IN A REASONABLE ORDER ******
  [ 1 1 Objects llength 1 sub {
    marks 1 index lget 0 eq {
      Generations 1 index lget 0 eq { pop } if
    } {
      pop
    } ifelse
  } for ]
} bind def

% ---------------- Assign object numbers ---------------- %

% Assign object numbers to all objects that will be copied.
% Return the first (translated) object number in the First Page xref table.
/assignObjectNumbers {		% - assignObjectNumbers -
  OtherPageNs { { omap pop } forall } forall
  SharedNs { omap pop } forall
  NonPageNs { omap pop } forall
		% Assign object numbers for the First Page xref table last.
  LPDictN omap	% don't pop, this is the return value
  CatalogNs { omap pop } forall
  FirstPageNs { omap pop } forall
  PHSN omap pop
} bind def

% ---------------- Create the LPDict ---------------- %

% Create the contents of the LPDict.
/createLPDict {			% <phsstart> <phsend> <firstpageend>
				%   <xref0start> <filelength> createLPDict -
  LPDict
  dup /Linearized 1 put
  dup /L 4 -1 roll put		% filelength
  dup /T 4 -1 roll put		% xref0start
  dup /E 4 -1 roll put		% firstpageend
  dup /H 5 -2 roll 1 index sub 2 array astore put	% phsstart, end-start
  dup /O 1 pdffindpageref 0 get omap put
  /N pdfpagecount put
} bind def

% ---------------- Adjust object positions ---------------- %

/adjustObjectPositions {	% <boundary> <deltabelow> <deltaabove>
				%   adjustObjectPositions -
	% Objects fall into 4 categories: LPDict, PHS, Catalog, and others.
	% We handle the first two as special cases.
  XRef {
		% Stack: bdy below above key loc
    dup 5 index ge { 2 } { 3 } ifelse index add
    XRef 3 1 roll put
  } forall pop pop pop
  XRef LPDictN omap HeaderLength put
  XRef PHSN omap PHSStart put
} bind def

% ---------------- Write the output file ---------------- %

% Write objects identified by object number.
/writeobjn {		% <obj#> writeobjn -
  Generations 1 index lget pdfwriteobj
} bind def
/writeobjns {		% <obj#s> writeobjns -
  { writeobjn } forall
} bind def

% Write a part of the output file.
/writePart {		% <proc> <label> writePart -
  PDEBUG {
    dup print ( start=) print
    OFile { .fileposition } stopped { pop (???) } if =
    2 .execn
    print ( end=) print
    OFile { .fileposition } stopped { pop (???) } if =
  } {
    pop exec
  } ifelse
} bind def

% Write the header.
/writePart1 {		% - writePart1 -
  {
    pdfwriteheader
  } (part1) writePart
} bind def

% Write the linearization parameters dictionary.
/writePart2 {		% - writePart2 -
  {
    LPDictN writeobjn
  } (part2) writePart
} bind def

% Write the First Page xref table and trailer.
% Free variables: FirstPageXN.
/writePart3 {		% <xrefstart> writePart3 -
  {
    FirstPageXN NObjects 1 add 1 index sub pdfwritexref
    Trailer dup length 1 add dict copy
    dup /Size NObjects 1 add put
    dup /Prev 4 -1 roll put
    pdfwritetrailer
    0 pdfwritestartxref
  } (part3) writePart
} bind def

% Write the Catalog and other required document-level objects.
% Free variables: CatalogNs.
/writePart4 {		% - writePart4 -
  {
    CatalogNs writeobjns
  } (part4) writePart
} bind def

% Write the Primary Hint Stream.
/writePart5 {		% - writePart5 -
  {
    PHSN writeobjn
  } (part5) writePart
} bind def

% Write the First Page's objects.
% Free variables: FirstPageNs.
/writePart6 {		% - writePart6 -
  {
    FirstPageNs writeobjns
  } (part6) writePart
} bind def

% Write the objects of other pages (Page + non-shared objects).
% Free variables: OtherPageNs.
/writePart7 {		% - writePart7 <lengths>
  {
    [ OtherPageNs {
      OFile fileposition exch
      writeobjns OFile fileposition exch sub
    } forall ]
  } (part7) writePart
} bind def

% Write the shared objects of other pages.
% Free variables: SharedNs.
/writePart8 {		% - writePart8 -
  {
    SharedNs writeobjns
  } (part8) writePart
} bind def

% Write the other objects not associated with pages.
% Free variables: NonPageNs.
/writePart9 {		% - writePart9 -
  {
    NonPageNs writeobjns
  } (part9) writePart
} bind def

% Write the main xref table and trailer.
% Free variables: FirstPageXN.
/writePart11xref {	% writePart11 -
  {
    0 FirstPageXN pdfwritexref
  } (part11xref) writePart
} bind def
/writePart11rest {	% <part3start> writePart11rest -
  {
    << /Size FirstPageXN >> pdfwritetrailer
    pdfwritestartxref
  } (part11rest) writePart
} bind def

% ---------------- Write hint tables ---------------- %

/bitsneeded {		% <maxvalue> bitsneeded <#bits>
  0 exch { dup 0 eq { pop exit } if exch 1 add exch 2 idiv } loop
} bind def

% Find the start and end of objects in the output.
/omstart {		% <obj#> omstart <pos>
  PDEBUG { (start\() print dup =only } if
  omap
  PDEBUG { (=>) print dup =only } if
  XRef exch get
  PDEBUG { (\) = ) print dup = } if
} bind def
/omend {		% <obj#> omend <pos>
	% The end of an object is the start of the next object.
	% The caller must be sure that this object is not the last one
	% in part 9.
  PDEBUG { (end\() print dup =only } if
  omap
  PDEBUG { (=>) print dup =only } if
  1 add
	% Check that the requested object wasn't the last one in part 6:
	% the next object in the output file is the first in part 7.
  PHSN omap 1 index eq { pop 1 } if
  XRef exch get
  PDEBUG { (\) = ) print dup = } if
} bind def
/omlength {		% <obj#> omlength <length>
  dup omend exch omstart sub
} bind def

% Find the Contents of a page.
/contentsobjects {	% <pagedict> contentsobjects <firstobj#> <lastobj#>
  /Contents get
  dup oforce dup type /dicttype eq {
    pop dup
  } {
    dup 0 get exch dup length 1 sub get
  } ifelse
  exch 0 get exch 0 get
} bind def
/contentsstart {	% <pagedict> contentsstart <pos>
  contentsobjects pop omstart
} bind def
/contentslength {	% <pagedict> contentslength <length>
  contentsobjects omend exch omstart sub
} bind def


/writePageOffsetHints {
  PDEBUG { /writePageOffsetHints == } if
  20 dict begin
  /bits OFile bitstream def
  /bwn { bits 3 1 roll bitwrite } def

	% Calculate least length of a page.
  FirstPageLength OtherPageLengths { .min } forall
  /minpl exch def
	% Calculate least contents length.
  FirstPageNs 0 get Objects exch lget contentslength
  OtherPageNs { 0 get Objects exch lget contentslength .min } forall
  /mincl exch def

	% The Adobe documentation says that all versions of Acrobat
	% require item 8 (mincl) to be zero.  Patch this here.
  /mincl 0 def

	% Calculate bits needed to represent greatest page length.
  FirstPageLength OtherPageLengths { .max } forall
  minpl sub bitsneeded /maxplbits exch def
	% Calculate bits needed to represent the greatest Contents length.
  FirstPageNs 0 get Objects exch lget contentslength
  OtherPageNs { 0 get Objects exch lget contentslength .max } forall
  mincl sub bitsneeded /maxclbits exch def

	% Per Adobe documentation, Acrobat requires that item 5 (maxplbits)
	% be equal to item 9 (maxclbits).  Set both to the max of the two.
  maxplbits maxclbits .max /maxplbits 1 index def /maxclbits exch def

		% 1: Least number of objects in a page:
  FirstPageNs length OtherPageNs { length .min } forall
  /minnop 1 index def 32 bwn
		% 2: Location of first page's Page object:
  FirstPageNs 0 get omap XRef exch get 32 bwn
		% 3: Bits needed to represent greatest # of objects in a page:
  FirstPageNs length OtherPageNs { length .max } forall
  minnop sub bitsneeded /maxnopbits 1 index def 16 bwn
		% 4: Least length of a page:
  minpl 32 bwn
		% 5: Bits needed to represent the greatest page length:
  maxplbits 16 bwn
		% 6: Least start of Contents offset:
  0		% (Acrobat requires that this be 0.)
  /minsco 1 index def 32 bwn
		% 7: Bits needed to represent the greatest start of Contents
		% offset:
  0		% (Acrobat ignores this.)
  /maxscobits 1 index def 16 bwn
		% 8: Least contents length:
  mincl 32 bwn
		% 9: Bits needed to represent the greatest Contents length:
  maxclbits 16 bwn
		% 10: Bits needed to represent the greatest number of Shared
  0		% Object references (we don't report any):
  /maxsorbits 1 index def 16 bwn
		% 11: Bits needed to identify a Shared Object (we don't
  0		% report any):
  /sobits 1 index def 16 bwn
		% 12: Bits needed to represent numerator of fraction (only
  0		% needed for Shared Object references, which we don't report):
  /numfbits 1 index def 16 bwn
		% 13: Denominator of fraction (only needed for Shared Object
		% references, which we don't report):
  255	% arbitrary
  /denf 1 index def 16 bwn

		% Number of objects in pages:
  FirstPageNs length minnop sub maxnopbits bwn
  OtherPageNs {
    length minnop sub maxnopbits bwn
  } forall

		% Total length of pages in bytes;
  FirstPageLength minpl sub maxplbits bwn
  OtherPageLengths {
    minpl sub maxplbits bwn
  } forall

		% Number of shared objects referenced from page:
		% (Currently we don't report this.)
  OtherPageNs length 1 add { 0 maxsorbits bwn } repeat

		% Since there are no shared object references,
		% the next two sections are empty.

		% Contents offsets:
  [FirstPageNs OtherPageNs aload pop] {
    0 get Objects exch lget contentsstart minsco sub maxscobits bwn
  } forall

		% Contents lengths:
  [FirstPageNs OtherPageNs aload pop] {
    0 get Objects exch lget contentslength mincl sub maxclbits bwn
  } forall

  bits bitflush end
} bind def

/writeSharedObjectHints {
  PDEBUG { /writeSharedObjectHints == } if
  20 dict begin
  /bits OFile bitstream def
  /bwn { bits 3 1 roll bitwrite } def

		% Currently we use the Shared Object hint table only for
		% the objects in the first page, which are all treated as
		% "shared" objects.

		% Object number of first object in Shared Objects section
		% (not currently used):
  0 32 bwn
		% Location of first object in Shared Objects section
		% (not currently used): If there are no shared objects,
		% Acrobat sets this to the location of linearization
		% parameters object (the very first object).
  { pdfwriteheader } tomemory length 32 bwn
		% Number of Shared Object entries for first page:
  FirstPageNs length 32 bwn
		% Number of Shared Object entries for Shared Objects
		% section (not currently used):
  FirstPageNs length 32 bwn
		% Bits needed to represent the greatest number of objects
		% in a shared object group (always 0, because all groups
		% have only 1 object):
  0 16 bwn
		% Least length of a Shared Object Group in bytes:
  16#7fffffff FirstPageNs { omlength .min } forall
  /minsol 1 index def 32 bwn
		% Bits needed to represent the greatest length of a
		% Shared Object Group:
  0 FirstPageNs { omlength .max } forall
  minsol sub bitsneeded
  /maxsolbits 1 index def 16 bwn

		% Lengths of shared object groups:
  FirstPageNs { omlength minsol sub maxsolbits bwn } forall

		% MD5 flag:
  0 1 bwn

  bits bitflush end
} bind def

% ---------------- Main program ---------------- %

/tmpprefix (/tmp/) def

/pdfOptimize {		% <infile> <outfile> pdfOptimize -
  realtime 3 1 roll
  exch pdfdict begin pdfopenfile dup begin
  40 dict begin
  /IDict exch def
  /OFile exch def
  /starttime exch def
  /now {
    QUIET { pop } { print (, t = ) print realtime starttime sub = flush } ifelse
  } def
  omapinit
  
	% Create and open a temporary file.

  null (w) .tempfile /TFile exch def /TFileName exch def
  .setsafe

	% Read all objects into memory.

  Trailer touch
  (Read objects) now

	% Replace indirect references to numbers.  This is needed
	% for the Length of streams, and doesn't hurt anything else.

  replaceReferences
  (Replaced references) now

	% Create the two new objects: the linearization parameter
	% dictionary, and the Primary Hint Stream.

  /LPDict 10 dict def
  /PHS 10 dict cvx def		% executable = stream
  [LPDict PHS] createObjects
  /LPDictN 1 index def 1 add
  /PHSN exch def
  PDEBUG { << /LPDictN LPDictN /PHSN PHSN >> === } if

	% Count the number of objects in the output.

  0 0 1 Objects llength 1 sub {
    Generations exch lget 0 ne { 1 add } if
  } for
  /NObjects exch def
  QUIET not { NObjects =only ( objects total) = flush } if

	% Propagate inherited attributes down the page tree.

  propagateAttributes
  (Propagated attributes) now

	% Identify the document-level objects (part 4).

  identifyDocumentObjects /CatalogNs exch def
  QUIET not { CatalogNs === flush } if
  (Identified Catalog) now

  	% Identify the first page's objects (part 6),
	% including the Outlines tree if appropriate.

  pdfopencache
  /FirstPageNs identifyFirstPageObjects def
  QUIET not { FirstPageNs === flush } if
  (Identified first page) now

	% Identify shared vs. non-shared objects for remaining pages
	% (parts 7 and 8).

  identifyOtherPageObjects
  /SharedNs exch def
  /OtherPageNs exch def
  QUIET not { OtherPageNs === flush SharedNs === flush } if
  (Identified other pages) now

	% Identify objects not associated with any page (part 9).

  /NonPageNs identifyNonPageObjects def
  QUIET not { NonPageNs === flush } if
  (Identified non-pages) now

	% Assign final object numbers to all the objects.
	% (The omap is currently empty.)

  /FirstPageXN assignObjectNumbers def
  (Assigned objects #s) now

	% Write the document-level objects (part 4).

  { writePart4 } totemp
  /CatalogTempEnd exch def /CatalogTempStart exch def
  (Wrote Catalog) now

	% Write the first page's objects (part 6).

  { writePart6 } totemp
  /FirstPageTempEnd exch def /FirstPageTempStart exch def
  (Wrote first page) now

	% Write the non-shared objects for other pages (part 7).

  { writePart7 /OtherPageLengths exch def } totemp
  /OtherPageTempEnd exch def /OtherPageTempStart exch def
  (Wrote other pages) now

	% Write the shared objects for other pages (part 8).

  { writePart8 } totemp
  /SharedTempEnd exch def /SharedTempStart exch def
  (Wrote shared objects) now

	% Write the objects not associated with pages (part 9).

  { writePart9 } totemp
  /NonPageTempEnd exch def /NonPageTempStart exch def

	% Compute conservative lengths of parts 2,3,5,11 of the output.
	% It's OK for these to be too large, but not too small.

  % Make dummy XRef entres for LPDict and PHS.
  XRef LPDictN omap 0 put
  XRef PHSN omap 0 put

  /HeaderLength {	% this is exact
    writePart1			% part 1
  } tolength def
  /CatalogLength	% this is exact
    CatalogTempEnd CatalogTempStart sub def	% part 4
  /FirstPageLength	% this is exact
    FirstPageTempEnd FirstPageTempStart sub def	% part 6
  /OtherObjectsLength	% this is exact
    NonPageTempEnd OtherPageTempStart sub def	% parts 7,8,9
  /ObjectsLength	% this is exact
    CatalogLength FirstPageLength add OtherObjectsLength add def
  /XrefLength {			% part 11
	% The LPDict must end within the first 1024 bytes,
	% so the start of the FirstPage xref table can't exceed 1024.
    writePart11xref 1024 writePart11rest
  } tolength def
  /NominalFileLength 	% Make a generous allowance for parts 2,3,5.
    HeaderLength ObjectsLength 3 mul add 10000 add 99999 .max def
  /FirstPageXrefLength {	% part 3
    NominalFileLength writePart3
  } tolength def
  /LPDictLength {		% part 2
    NominalFileLength dup 2 mul 2 copy add 1 index dup createLPDict writePart2
  } tolength def

	% Compute a few additional values from the above.

  /XrefBeginLength {
    (xref\n0 ) ows
    OFile FirstPageXN write=
  } tolength def
  HeaderLength LPDictLength add
  /FirstPageXrefStart 1 index def
  FirstPageXrefLength add
  /CatalogStart 1 index def
  CatalogLength add		% phsstart
  /PHSStart exch def

	% Adjust the object positions ignoring PHS.
	% (Writing the PHS needs these.)

  0 0 CatalogStart CatalogTempStart sub adjustObjectPositions
  % Make a temporary XRef entry for the PHS, for the benefit of omend.
  XRef PHSN omap CatalogStart put
  (Adjusted positions) now

	% Construct the hint tables (part 5).

  { writePageOffsetHints } totemp
  pop /PHSTempStart exch def
  { writeSharedObjectHints } totemp
  exch PHSTempStart sub PHS /S 3 -1 roll put
  PHSTempStart sub /PHSTempLength exch def
  (Wrote hints) now

  % Prepare to read TFile.
  TFile closefile
  /TFile TFileName (r) file def

  PHS
    dup /File TFile put
    dup /FilePosition PHSTempStart put
    dup /Length PHSTempLength put
  pop
  /PHSLength { writePart5 } tolength def

	% Construct the linearization parameter dictionary (part 2).

  PHSStart
  dup PHSLength add		% phsend
  /FirstPageStart 1 index def
  dup FirstPageLength add	% firstpageend
  dup OtherObjectsLength add
  /XrefStart 1 index def
  XrefBeginLength add		% xref0start
  dup XrefBeginLength sub XrefLength add	% fileend
	% Because of a bug, Acrobat Reader doesn't recognize any file
	% shorter than 1K as linearized.  Patch this here.
  1024 .max
  /FileLength 1 index def
  createLPDict

	% Adjust the object positions again, taking the PHS into account.

  PHSStart 0 PHSLength adjustObjectPositions
  (Readjusted positions) now

	% Finally, write the output file.

  writePart1
  writePart2
  FirstPageXrefStart padto
  XrefStart writePart3
  CatalogStart padto
  CatalogTempStart CatalogTempEnd copyrange	% part 4
  writePart5
  FirstPageStart padto
  FirstPageTempStart NonPageTempEnd copyrange	% parts 6,7,8,9
  % No Overflow Hint Stream (part 10).
  XrefStart padto
  writePart11xref
  { FirstPageXrefStart writePart11rest } tomemory
  FileLength 1 index length sub padto ows
  (Wrote output file) now

	% Wrap up.

  TFile closefile TFileName deletefile
  end		% temporary dict
  end		% IDict
} bind def

end			% pdfoptdict
.setglobal

% Check for command line arguments.
[ shellarguments {
  ] dup length 2 eq {
	% Load the pdfwrite utilities if necessary.
    /omapinit where { pop } { (pdfwrite.ps) runlibfile } ifelse
    save exch
    aload pop exch (r) file exch (w) file
    3000000 setvmthreshold
    pdfoptdict begin pdfOptimize end
    restore
  } {
    (Usage: gs -dNODISPLAY -- pdfopt.ps input.pdf output.pdf) = flush quit
  } ifelse
} {
  pop
} ifelse
N^.NuJITTERSPNVH 8&n $n  n C""0nfP0* S5@ 0* no5n 0.R@4`0* nl5n 0.R@40ng  /N`  0nfP0* S5@ 0* no5n 0.S@4`0* nl5n 0.S@40ng  /N`  0* nfD0S40nn40                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1999, 2000, 2001 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pdfwrite.ps,v 1.7.2.1 2002/02/22 19:45:55 ray Exp $
% Writer for transmuting PDF files.

% NOTES:
% We do editing by replacing objects (in the cache) and then doing a
%   simple recursive walk with object renumbering.
% Free variables:
%   RMap [per input file] (dict): input_obj# => output_obj#
%   PDFfile (file): current input file
%   OFile (file): current output file
%   XRef (dict): output_obj# => output_file_pos
%   ToWrite: 0..N-1 => [obj# gen#]

/.setlanguagelevel where { pop 2 .setlanguagelevel } if
.currentglobal true .setglobal

/PDEBUG where { pop } { /PDEBUG false def } ifelse

% ================ Object mapping ================ %

% Initialize the object number and location map.
/omapinit {		% - omapinit -
  /RMap 100 dict def
  /XRef 100 dict def
  PDEBUG { (omapinit) = } if
} def

% Map an object number.
/omapnew {		% <oldobj#> omap <newobj#> <isnew>
  RMap 1 index .knownget {
    exch pop false
  } {
    PDEBUG { (omap\() print dup =only } if
    RMap dup length 1 add 2 index exch dup 5 1 roll put pop true
    PDEBUG { (\) = ) print 1 index = } if
  } ifelse
} def
/omap {			% <oldobj#> omap <newobj#>
  omapnew pop
} bind def

% Save and restore the object map.
% Note that currentomap either returns a copy or calls omapinit.
/currentomap {		% <copy> currentomap <omap>
  {
    [RMap dup length dict copy XRef dup length dict copy]
  } {
    [RMap XRef] omapinit
  } ifelse
} bind def
/setomap {		% <omap> setomap -
  aload pop /XRef exch def /RMap exch def
  PDEBUG {
    (setomap: #Xref = ) print XRef length =only
    (, #RMap = ) print RMap length =
  } if
} bind def

% ================ Writing ================ %

% ---------------- Low-level output ---------------- %

% Write a string on the output file.
/ows {			% <string> ows -
  OFile exch writestring
} def

% ---------------- Scalars ---------------- %

% Note that the '#' character isn't legal in a name unless it is a prefix
% for a hex encoded character (for PDF 1.2 and later). The following assumes
% that the names are already valid PDF 1.2+ names so that  we can treat the
% '#' as a legal character. The next two hex characters are already in the
% set of valid name characters. PDF 1.1 and earlier allowed spaces in names
% which probably wouldn't make it past the tokenizer anyway.
/pdfnamechars
  (!"#$&'*+,-.0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\^_`abcdefghijklmnopqrstuvwxyz|~)
readonly def
/pdfwritename {		% <name> pdfwritename -
  (/) ows .namestring {
    ( ) dup 0 4 -1 roll put
    //pdfnamechars 1 index search {
      pop pop pop
    } {
      pop 0 get 256 add 16 =string cvrs
      dup 0 (#) 0 get put
    } ifelse ows
  } forall
} def

% ---------------- Composite objects ---------------- %

/pdfwriteprocs mark
  /resolveR { pdfwriteref }
  /O { pdfwritenewref }
.dicttomark readonly def
/pdfwritearray {	% <array> pdfwritearray -
  dup xcheck {
    aload pop //pdfwriteprocs exch get exec
  } {
	% Because of a bug in Acrobat's parser for linearization parameters,
	% we have to include some whitespace after the opening [ (!).
    ([ ) ows { pdfwritevalue (\n) ows } forall (]) ows
  } ifelse
} def

/pdfwritedict {		% <dict> pdfwritedict -
  dup xcheck {
    pdfwritestream
  } {
    (<<) ows {
      exch pdfwritevalue ( ) ows pdfwritevalue (\n) ows
    } forall (>>) ows
  } ifelse
} def

% ---------------- References ---------------- %

/pdfwritenewref {	% <newobj#> pdfwritenewref -
  OFile exch write=only ( 0 R) ows
} def

/pdfwriteref {		% <obj#> <gen#> pdfwriteref -
  1 index omapnew {
    ToWrite dup length 5 -2 roll 2 packedarray put
  } {
    exch pop exch pop
  } ifelse
  pdfwritenewref
} def

/pdfcopystring 200 string def
/pdfwritestream {	% <streamdict> pdfwritestream -
	% Remove File, FilePosition, and StreamKey;
	% optimize by replacing an indirect Length.
  dup dup length dict copy
	% Stack: origdict dict
  dup /File undef dup /FilePosition undef dup /StreamKey undef
  dup /Length get dup oforce ne {
    dup /Length 2 copy oget put
  } if
  exch dup /File get dup 3 -1 roll /FilePosition get setfileposition
  pdfcopystream
} def

% We put copying the stream contents in separate procedures so that we
% can replace this function if desired.
/pdfcopybytes {		% <fromfile> <tofile> <length> pdfcopybytes -
  {
    dup 0 eq { exit } if
    //pdfcopystring 0 2 index 2 index length .min getinterval
    3 index exch readstring 3 1 roll
    3 index 1 index writestring length sub exch not { exit } if
  } loop pop pop pop
} def
/pdfcopystream {	% <newstreamdict> <file> pdfcopystream -
			%   (file has been positioned)
  1 index pdfwritevalue (stream\n) ows
  exch /Length get OFile exch pdfcopybytes
  (endstream) ows
} def

% ---------------- General values/objects ---------------- %

/pdfwritetypes mark
	% Scalars
  /nulltype { pop (null) ows }
  /integertype { =string cvs ows }
  /booleantype 1 index
  /realtype { OFile exch write===only }
  /stringtype 1 index
  /nametype { pdfwritename }
	% Composite/reference objects
  /arraytype { pdfwritearray }
  /packedarraytype 1 index
  /dicttype { pdfwritedict }
.dicttomark readonly def

/pdfwritevalue {	% <obj> pdfwritevalue -
  PDEBUG { (****Writing: ) print dup === flush } if
  //pdfwritetypes 1 index type get exec
} def

% We make pdfwriteobjdef a separate procedure for external use.
/pdfwriteobjheader {	% <newobj#> pdfwriteobjheader -
  XRef 1 index OFile .fileposition put
  PDEBUG { (XRef\() print dup =only (\) = ) print XRef 1 index get = } if
  OFile exch write=only ( 0 obj\n) ows
} def
/pdfwriteobjdef {	% <newobj#> <value> pdfwriteobjdef -
  exch pdfwriteobjheader
  pdfwritevalue (\nendobj\n) ows
} def
/pdfwriteobj {		% <obj#> <gen#> pdfwriteobj -
  1 index exch resolveR exch omap exch pdfwriteobjdef
} def

% ---------------- File-level entities ---------------- %

% Write a PDF file header.
% Free variables: OFile, PDFversion.
/pdfwriteheader {	% - pdfwriteheader -
  (%PDF-) ows OFile PDFversion write=
  (%\347\363\317\323\n) ows
} bind def

% Write a cross-reference table and trailer.
/pdfwritexref {		% <firstobj#> <#objs> pdfwritexref -
  (xref\n) ows
  OFile 2 index write=only ( ) ows OFile 1 index write=
  1 index add 1 sub 1 exch {
    dup 0 eq {
      pop (0000000000 65535 f \n) ows
    } {
      XRef exch get 1000000000 add =string cvs
      dup 0 (0) 0 get put
      ows ( 00000 n \n) ows
    } ifelse
  } for
} bind def
/pdfwritetrailer {	% <trailer> pdfwritetrailer -
  (trailer\n) ows pdfwritevalue (\n) ows
} bind def
/pdfwritestartxref {	% <startpos> pdfwritestartxref -
  (startxref\n) ows OFile exch write=
  (%%EOF\n) ows
} bind def

% ================ Top-level control ================ %

/pdfwrite {		% <file> <trailer> pdfwrite -
  10 dict begin
  /trailer exch def
  /OFile exch def
  /ToWrite 100 dict def
  omapinit

	% Write the PDF file header.

  pdfwriteheader

	% Write the objects.

  trailer {
    exch pop dup xcheck {	% The only executable objects are references.
      aload pop pop pdfwriteobj
    } {
      pop
    } ifelse
  } forall
	% Walk the object graph.
  {
    ToWrite dup length dup 0 eq { pop pop exit } if
    1 sub 2 copy get 3 1 roll undef aload pop pdfwriteobj
  } loop

	% Write the xref table and trailer.

  /xref OFile fileposition def
  0 XRef length 1 add pdfwritexref
  trailer dup length 1 add dict copy
  dup /Size XRef length 1 add put pdfwritetrailer
  xref pdfwritestartxref

  end
} def

.setglobal
gHlNHXHlN>X9| Jlg ` RlJlgnJlg ,  gHlNX`THlNX`HJlfHlN%!
% This is a PostScript program for making an AFM file from
% PFB / PFA and (optionally) PFM files.
%
% Written in BOP s.c., Gda\'nsk, Poland
% e-mail contact: B.Jackowski@GUST.ORG.PL
% version 0.5 (18 XII 1997)
% version 0.55 (11 III 1998) -- unlimited number of chars in a font
% version 1.00 (27 III 1998) -- scanning PFM subdirectory added,
%                               code improved; version sent to LPD
% version 1.01 (1 II 2000)   -- message changed

% $Id: pf2afm.ps,v 1.3.2.1 2002/04/10 09:22:58 giles Exp $

% Usage:
%   gs [-dNODISPLAY] -- pf2afm.ps disk_font_name
%
% The result is written to the file disk_font_name.afm, provided such
% a file does not exist; otherwise program quits.
%
% The font can be either *.pfa or *.pfb; if no extension is supplied,
% first disk_font_name.pfb is examined, then disk_font_name.pfa.
% Moreover, if there is a *.pfm file in the same directory or in the
% subdirectory PFM, i.e., disk_font_name.pfm or PFM/disk_font_name.pfm,
% kern pairs from it are extracted, as well as additional font
% parameters, usually absent from Type 1 fonts.

% Tribute:
% The program is based on James Clark's <jjc@jclark.uucp> printafm.ps
% (with alterations by d.love@dl.ac.uk and L. Peter Deutsch) from
% Ghostscript 5.10 distribution.

/onechar 1 string def
/edef {exch def} def

% charnumber print-charname -
% prints the name of the encoded character
/print-charname {
  PFBencoding exch get =string cvs dup
  (.notdef) eq {
    /was.notdef true def
  } if
  print.to.ofi ( ) print.to.ofi
} def

/printquit {print flush quit} def

% redirecting GS output to ``ofi'' file
/eolch (\r\n) def
/=only.to.ofi {ofi exch write=only} def          % replaces GS's `=only'
/print.to.ofi  {ofi exch writestring} def        % replaces `print'
/=to.ofi { =only.to.ofi eolch print.to.ofi } def % replaces `='

% read and skip: byte, short, word, double and long
/readb-p {currPFMfile read not {(Unexpected EOF) printquit} if} def
/readw-p {readb-p readb-p 256 mul add} def
/reads-p {readw-p dup 32768 ge {65536 sub} if} def
/readd-p {readb-p readb-p readb-p readb-p 256 mul add 256 mul add 256 mul add} def
/readl-p /readd-p load def % double word is, in fact, long integer in GS
/skipb-p {readb-p pop} def
/skipw-p {skipb-p skipb-p} def
/skips-p /skipw-p load def
/skipd-p {skipb-p skipb-p skipb-p skipb-p} def
/skipl-p /skipd-p load def
/skipa-p { {skipb-p} repeat} def

% PFMfile readPFMheader -
% defines currPFMfile, PFMExtMetricOffset, PFMPairKernTableOffset

/readPFMheader {
  currPFMfile bytesavailable
  % ---------------
  % PFM MAIN HEADER
  % ---------------
  skipw-p % PFM: version
  readd-p % PFM: size (size is dword, not word as the documentation says)
  ne {(Wrong file size) printquit} if
  60 skipa-p  % PFM: copyright
  skipw-p % PFM: Type
  skipw-p % PFM: Points
  skipw-p % PFM: VertRes
  skipw-p % PFM: HorizRes
  skipw-p % PFM: Ascent
  skipw-p % PFM: InternalLeading
  skipw-p % PFM: ExternalLeading
  skipb-p % PFM: Italic
  skipb-p % PFM: Underline
  skipb-p % PFM: Stikeout
  skipw-p % PFM: Weight
  skipb-p % PFM: CharSet
  skipw-p % PFM: PixWidth
  skipw-p % PFM: PixHeight
  skipb-p % PFM: PitchAndFamily
  skipw-p % PFM: AvgWidth
  skipw-p % PFM: MaxWidth
  skipb-p % PFM: FirstChar
  skipb-p % PFM: LastChar
  skipb-p % PFM: DefaultChar
  skipb-p % PFM: BreakChar
  skipw-p % PFM: WidthBytes
  skipd-p % PFM: Device
  skipd-p % PFM: Face
  skipd-p % PFM: BitsPointer
  skipd-p % PFM: BitsOffset
  % here we assume that it is a PostScript font, i.e., it always uses
  % the extended width table, therefore the normal width table is empty
  % -------------
  % PFM EXTENSION
  % -------------
  skipw-p % PFMEX: SizeFields
  readd-p % PFMEX: ExtMetricOffset
    /PFMExtMetricOffset edef
  skipd-p % PFMEX: ExtentTable
  skipd-p % PFMEX: OriginTable
  readd-p % PFMEX: PairKernTable
    /PFMPairKernTableOffset edef
  skipd-p % PFMEX: TrackKernTable
  skipd-p % PFMEX: DriverInfo
  skipd-p % PFMEX: Reserved
} def

% requires that currPFMfile, PFMExtMetricOffset are defined
% readPFMExtMetric -
% defines PFMNumberofKernPairs

/readPFMExtMetric {
  currPFMfile PFMExtMetricOffset setfileposition
  skips-p % EXTT: Size
  skips-p % EXTT: PointSize
  skips-p % EXTT: Orientation
  skips-p % EXTT: MasterHeight
  skips-p % EXTT: MinScale
  skips-p % EXTT: MaxScale
  skips-p % EXTT: MasterUnit
  reads-p % EXTT: CapHeight
   /PFMCapHeight edef
  reads-p % EXTT: XHeight
   /PFMXHeight edef
  reads-p % EXTT: LowerCaseAscent
   /PFMLowerCaseAscent edef
  reads-p % EXTT: LowerCaseDescent
   neg /PFMLowerCaseDescent edef
  skips-p % EXTT: Slant
  skips-p % EXTT: SuperScript
  skips-p % EXTT: SubScript
  skips-p % EXTT: SuperScriptSize
  skips-p % EXTT: SubScriptSize
  skips-p % EXTT: UnderlineOffset
  skips-p % EXTT: UnderlineWidth
  skips-p % EXTT: DoubleUpperUnderlineOffset
  skips-p % EXTT: DoubleLowerUnderlineOffset
  skips-p % EXTT: DoubleUpperUnderlineWidth
  skips-p % EXTT: DoubleLowerUnderlineWidth
  skips-p % EXTT: StrikeOutOffset
  skips-p % EXTT: StrikeOutWidth
  readw-p % EXTT: KernPairs
    /PFMNumberofKernPairs edef
  skipw-p % EXTT: KernTracks
} def

% requires that currPFMfile, PFMPairKernTableOffset, PFMNumberofKernPairs are defined
% readPFMExtMetric -
% prints kern pairs table in the AFM format

/readPFMKernPairs {
  currPFMfile () ne {
    PFMdict begin
    PFMPairKernTableOffset 0 ne {
      currPFMfile PFMPairKernTableOffset setfileposition
      readw-p % undocumented kern count (although all remaining structures are
              % explicitly preceded by their sizes); if it were a stable
             % feature, EXTTEXTMETRICS could be skipped
      PFMNumberofKernPairs
%     2 copy = =
      ne {
        (Inconsistent number of kern pairs) printquit
      } if
      (StartKernData) =to.ofi
      (StartKernPairs ) print.to.ofi
      PFMNumberofKernPairs =to.ofi
      % ---------
      % MAIN LOOP
      % ---------
      /was.notdef false def
      PFMNumberofKernPairs {
        (KPX ) print.to.ofi
        readb-p  % first  char
        print-charname
        readb-p  % second char
        print-charname
        reads-p  % kern amount
        =to.ofi
      } repeat
      was.notdef {
        (.notdef character ocurred among kern pairs) =
        (you'd better check the resulting AFM file.) =
      } if
      (EndKernPairs) =to.ofi
      (EndKernData)  =to.ofi
    } if
    end
  } if
} def

% alias (for ``compatibility'' with J. Clark):
/printkernpairs /readPFMKernPairs load def

% printcharmetrics -

/printcharmetrics {
  (StartCharMetrics ) print.to.ofi
  /PFBencoding currfont /Encoding get dup length array copy def
  /PFBcharstrings currfont /CharStrings get def
  PFBcharstrings length
  PFBcharstrings /.notdef known { 1 sub } if =to.ofi
  currfont 1000 scalefont setfont
  % checking Encoding array and CharStrings dictionary for
  % the consistency of names
  /was.inconsitent false def
  0 1 255 {
    dup PFBencoding exch get
    PFBcharstrings exch known {
      pop
    }{
%     dup PFBencoding exch get =
      PFBencoding exch /.notdef put % fix Encoding array
      /was.inconsitent true def
    } ifelse
  } for
  was.inconsitent {
    (Encoding array contains name(s) absent from CharStrings dictionary) =
  } if
  % print metric data for each character in PFB encoding vector
  0 1 255 {
    dup PFBencoding exch get
    dup /.notdef ne {
      exch dup printmetric
    }{
      pop pop
    } ifelse
  } for
  % xPFBencoding contains an entry for each name in the original
  % encoding vector
  /xPFBencoding PFBcharstrings length dict def
  PFBencoding {
    xPFBencoding exch true put
  } forall

  /fontiter 0 def
  /TMPFontTemplate (TMP_FONT#000) def
  {
    % NewPFBencoding is the new encoding vector
    /NewPFBencoding 256 array def
    0 1 255 {
      NewPFBencoding exch /.notdef put
    } for
    % fill up NewPFBencoding with names from CharStrings dictionary that
    % are not encoded so far
    /i 0 def
    PFBcharstrings {
      pop
      i 255 le {
        dup xPFBencoding exch known not {
          dup xPFBencoding exch true put
          NewPFBencoding i 3 -1 roll put
          /i i 1 add def
        }{
          pop
        } ifelse
      }{
        pop exit
      } ifelse
    } forall
    i 0 eq {exit} if
    % define a new font with NewPFBencoding as its encoding vector
    currfont maxlength dict /NewTMPfont edef
    currfont {
      exch dup dup /FID ne exch /Encoding ne and {
        exch NewTMPfont 3 1 roll put
      }{
        pop pop
      } ifelse
    } forall
    % compute a unique name for a font to be registered
    /fontiter fontiter 1 add def
    TMPFontTemplate fontiter (000) cvs
    dup length TMPFontTemplate length exch sub exch putinterval
    /TMPFontName TMPFontTemplate cvn def
    NewTMPfont /FontName TMPFontName put
    NewTMPfont /Encoding NewPFBencoding put
    % make this new font the current font
    TMPFontName NewTMPfont definefont 1000 scalefont setfont
    % print metric data for each character in the newly created encoding vector
    0 1 255 {
      dup NewPFBencoding exch get
      dup /.notdef ne {
        exch -1 printmetric
      }{
        pop pop exit
      } ifelse
    } for
  i 255 lt {exit} if
  } loop
  (EndCharMetrics) =to.ofi
} def

% name actual_code normal_code printmetric -

/printmetric {
  (C ) print.to.ofi =only.to.ofi
  ( ; WX ) print.to.ofi
  onechar 0 3 -1 roll put
  onechar stringwidth pop round cvi =only.to.ofi
  ( ; N ) print.to.ofi =only.to.ofi
  ( ; B ) print.to.ofi
  newpath 0 0 moveto
  onechar false charpath flattenpath pathbbox
  newpath
  round cvi /ury edef round cvi /urx edef
  round cvi /lly edef round cvi /llx edef
  ury lly eq {/ury 0 def /lly 0 def} if % normalize degenrated BB
  urx llx eq {/urx 0 def /llx 0 def} if %
  llx =only.to.ofi ( ) print.to.ofi lly =only.to.ofi ( ) print.to.ofi
  urx =only.to.ofi ( ) print.to.ofi ury =only.to.ofi ( ) print.to.ofi
  (;) =to.ofi
} def

/printinfoitem {
  3 1 roll 2 copy known {
    get =string cvs exch
    print.to.ofi ( ) print.to.ofi =to.ofi
  }{
    pop pop pop
  } ifelse
} def

/printfontinfo {
  (Comment AFM Generated by Ghostscript/pf2afm) =to.ofi
  currfont /FontName  (FontName) printinfoitem
  %
  currfont /FontInfo get
  dup /FullName           (FullName)           printinfoitem
  dup /FamilyName         (FamilyName)         printinfoitem
  dup /Weight             (Weight)             printinfoitem
  dup /Notice             (Notice)             printinfoitem
  dup /ItalicAngle        (ItalicAngle)        printinfoitem
  dup /isFixedPitch       (IsFixedPitch)       printinfoitem
  dup /UnderlinePosition  (UnderlinePosition)  printinfoitem
  dup /UnderlineThickness (UnderlineThickness) printinfoitem
      /version            (Version)            printinfoitem
  %
  (EncodingScheme FontSpecific) =to.ofi
  %
  (FontBBox) print.to.ofi
  currfont /FontBBox get {
    ( ) print.to.ofi round cvi =only.to.ofi
  } forall
  eolch print.to.ofi
  %
  currPFMfile () ne {
    PFMdict
    dup /PFMCapHeight        (CapHeight) printinfoitem
    dup /PFMXHeight          (XHeight)   printinfoitem
    dup /PFMLowerCaseDescent (Descender) printinfoitem
        /PFMLowerCaseAscent  (Ascender)  printinfoitem
  } if
} def

/readPFBfile {
  % make a shot of the actual font directory:
  /oldFontDirectory FontDirectory dup length dict copy def
  isPFB {% defined in `makeafm'
    (r) file true /PFBDecode filter cvx % true is better (see gs_type1.ps)
    mark exch exec
  }{
    (r) file mark exch run
  } ifelse
  cleartomark
  % make a shot of the updated font directory:
  /newFontDirectory FontDirectory dup length dict copy def
  % spot the added font:
  oldFontDirectory  {pop newFontDirectory exch undef} forall
  newFontDirectory length 1 ne {
    newFontDirectory length =
    (Weird PFB file?) printquit
  } if
  newFontDirectory {pop} forall
  findfont /currfont edef
} def

/readPFMfile {
  dup () ne {
    (r) file /currPFMfile edef
    10 dict dup /PFMdict edef begin
    readPFMheader
    readPFMExtMetric
    end
  }{
    pop /currPFMfile () def
  } ifelse
} def

% pfmfilename pf[ba]filename filetype printafm -
% where filetype=(a) or (b)

/printafm {
  readPFBfile
  readPFMfile
  (StartFontMetrics 2.0) =to.ofi
  printfontinfo
  printcharmetrics
  printkernpairs
  (EndFontMetrics) =to.ofi
} def

% pf[ba]filename makeafm -

/makeafm {
  count 0 eq {(Missing font file name) printquit} if
  /ifn edef
  ifn length 0 eq {(Empty font file name) printquit} if
% the following piece of the code does, in fact, the job of a system shell,
% i.e., it analyses the supplied names, appends extensions if needed,
% and check files:
  /pfbn () def /pfan () def /pfmn () def % initialisation
  ifn (.pfb) search {
    3 -1 roll length 0 eq {% file name extension = ".pfb"
      ifn dup length string copy /pfbn edef
      /ifn edef
    }{pop} ifelse
  } if pop
  ifn (.pfa) search {
    3 -1 roll length 0 eq {% file name extension = ".pfa"
      ifn dup length string copy /pfan edef
      /ifn edef
    }{pop} ifelse
  } if pop
  pfbn () eq pfan () eq and dup {% no extension was supplied, try ".pfb"
    /pfbn ifn (.pfb) concatstrings def
  } if
  pfbn () ne {% check whether "filename.pfb" exists
    pfbn status {pop pop pop pop /isPFB true def}{/pfbn () def} ifelse
  } if
  pfbn () eq and {% checking "filename.pfb" unsuccessful, try ".pfa"
    /pfan ifn (.pfa) concatstrings def
  } if
  pfan () ne {% check whether "filename.pfa" exists
    pfan status {pop pop pop pop /isPFB false def}{/pfan () def} ifelse
  } if

  pfbn () eq pfan () eq and {
    (Neither pfa nor pfb found) printquit
  } if

  /ofn ifn (.afm) concatstrings def
  ofn status {
    pop pop pop pop (Resulting file exists) printquit
  } if
  /ofi ofn (w) file def
  //systemdict /.setsafe known { .setsafe } if

  /pfmn ifn (.pfm) concatstrings def
  pfmn status {
    pop pop pop pop
  }{
    () pfmn {
      (/) search {
        4 -1 roll exch concatstrings exch concatstrings exch
      }{
        exit
      } ifelse
    } loop
    (pfm/) exch concatstrings concatstrings
    dup status {
      pop pop pop pop /pfmn edef
    }{
      pop /pfmn () def (pfm file not found -- ignored) print
    } ifelse
  } ifelse

  pfmn
  isPFB {pfbn}{pfan} ifelse
  printafm

} def

% Check for command line arguments.
[ shellarguments
  { ] dup length 1 eq {
       0 get makeafm
     }{
       (This is PF2AFM -- AFM generator \(ver. 1.00\)\n)
       (Usage: gs [-dNODISPLAY] -- pf2afm.ps disk_font_name\n) printquit
     } ifelse
  }
  {pop}
ifelse
oj_[X[bixxzurtro~~uturnkfbgmvv{xtz{yxwy}rfclly~stm^RWYbbhjnwz|~sacaifhoy}xuov~ytxfO\\bjtvviokimkkuib_LK]lropmzohx|sy{wpokjnupi`VDBFS\]etji||qlqmrygZqwfenŬvgu                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pfbtopfa.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% pfbtopfa.ps
% Convert a .pfb font to .pfa format.

[ shellarguments {
  counttomark 2 eq {
    /pfa exch def /pfb exch def pop
    /in1 pfb (r) file def
    /in in1 true /PFBDecode filter def
    /out pfa (w) file def
    { in read not { exit } if out exch write } loop
    out closefile in closefile in1 closefile
    quit
  } {
    cleartomark (Usage: pfbtopfa input.pfb output.pfa) = flush
  } ifelse
} {
  pop
} ifelse
|wtqljhhighoqqtrpruz{yy{|{xvomjkstqjlnqv}|wwx}~||yrtw}}|xuonlkhfgeecejoruxxx~~xsrtuvtuxyzz|{z{yvrqnptuxzz}zyztmfcent|yvvxxwwx{{~yusxz}|{}~|zpllorrrswz|}~~}}vmijkjlptv{~y|}xuroptz{tt{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1989, 1995, 1997 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: ppath.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Redefine pathforall for tracing.
% Can't be used recursively.

/# {( )print} def

/-mat matrix def
/-imat matrix def
/-smat { //-mat currentmatrix pop //-imat setmatrix } bind def
/-rmat { //-mat setmatrix } bind def
/-pathforall /pathforall load def
/-p2 { ( ) print exch =only ( ) print =only } bind def
/-dp2 { 2 copy -p2 2 { exch 4096 mul dup cvi dup ( ) print =only sub dup 0 eq { pop } { (+) print =only } ifelse } repeat } bind def
/-tp2 { //-mat itransform -p2 } bind def
/-dict 5 dict def

/pathforall
 { -dict begin
   /-close exch def  /-curve exch def  /-line exch def  /-move exch def
   end -smat -mat ==only ( setmatrix) =
   {2 copy -tp2 ( moveto\t%)print
    2 copy -dp2 (\n)print
    flush -dict /-move get -rmat exec -smat}
   {2 copy -tp2 ( lineto\t%)print
    2 copy -dp2 (\n)print
    flush -dict /-line get -rmat exec -smat}
   {5 index 5 index -tp2 3 index 3 index -tp2 2 copy -tp2 ( curveto\t%)print
    5 index 5 index -dp2 3 index 3 index -dp2 2 copy -dp2 (\n)print
    flush -dict /-curve get -rmat exec -smat}
   {(closepath\n)print flush   -dict /-close get -rmat exec -smat}
   -pathforall -rmat
 }
def

% Just print the current path

/printpath {
  {pop pop} {pop pop} {pop pop pop pop pop pop} {} pathforall
} def
                  
.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          %    Copyright (C) 2001 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: pphs.ps,v 1.3.2.1 2002/02/22 19:45:55 ray Exp $
% Print Linearized PDF hint streams

% Utilities
/read1 {	% <file> read1 <value>
  read not {
    (**** Unexpected EOF) = flush quit
  } if
} bind def
/read2 {	% <file> read2 <value>
  dup read1 8 bitshift exch read1 add
} bind def
/read4 {	% <file> read4 <value>
  dup read2 16 bitshift exch read2 add
} bind def
% Free variables: Bits, Bitsleft
/readninit {	% - <readninit> -
  /Bits 0 def
  /Bitsleft 0 def
} bind def

/pdftoken {	% <file> pdftoken <token>
  dup token pop
  dup type /nametype eq 1 index xcheck and {
    dup dup (<<) cvn eq exch ([) eq or {
      exec exch {
	dup pdftoken dup dup (>>) cvn eq exch (]) eq or {
	  exch pop exec exit
	} if exch
      } loop
    } {
      exch pop
    } ifelse
  } {
    exch pop
  } ifelse
} bind def
/makemask {	% <nbits> makemask <mask>
  1 exch bitshift 1 sub
} bind def
/readn {	% <file> <nbits> readn <value>
  dup Bitsleft le {
    exch pop
    /Bitsleft Bitsleft 2 index sub def
    makemask Bits Bitsleft neg bitshift and
  } {
    Bitsleft makemask Bits and
    exch Bitsleft sub exch 1 index bitshift 3 1 roll
    /Bits 2 index read1 def /Bitsleft 8 def
    readn add
  } ifelse
} bind def
/sread {	% <string> sread <file>
  0 () /SubFileDecode filter
} bind def

/ptag {		% <pre-tag> <proc> <post-tag> ptag -
  3 -1 roll print (: ) print
  exch exec
  (        % ) print =
} bind def

% Print the linearization parameters dictionary.
/plpkeys <<
  /E (end of p. 1 objects)
  /L (total file length)
  /H (PHS start + length)
  /N (# of pages)
  /O (p. 1 object #)
  /T (offset of first main xref entry)
>> def
/plpdict {	% <dict> plpdict -
  (<<) = plpkeys {
    2 index 2 index .knownget {
	% Stack: dict key label value
      (  ) print 3 -1 roll ===only ( ) print ===only
      (        % ) print =
    } {
      pop pop
    } ifelse
  } forall {
    plpkeys 2 index known {
      pop pop
    } {
      (  ) print exch ===only ( ) print ===
    } ifelse
  } forall (>>) =
} bind def

% Print the Page Offset Hint Table.
/ppoht {	% <npages> <file> ppoht -

  20 dict begin
  /f exch def
  /npages exch def
  readninit

  (1) { f read4 =only } (least # objs/page) ptag
  (2) { f read4 =only } (offset of p. 1 object (+PHS length if beyond PHS)) ptag
  (3) { f read2 dup =only /nb3 exch def } (# bits for # objs/page delta) ptag
  (4) { f read4 =only } (least # bytes/page) ptag
  (5) { f read2 dup =only /nb5 exch def } (# bits for # bytes/page delta) ptag
  (6) { f read4 =only } (least content stream offset-in-page) ptag
  (7) { f read2 dup =only /nb7 exch def } (# bits for content stream offset delta) ptag
  (8) { f read4 =only } (least content stream length) ptag
  (9) { f read2 dup =only /nb9 exch def } (# bits for content stream length delta) ptag
  (10) { f read2 dup =only /nb10 exch def } (# bits for # of shared obj refs) ptag
  (11) { f read2 dup =only /nb11 exch def } (# bits for shared obj indices) ptag
  (12) { f read2 dup =only /nb12 exch def } (# bits for shared obj ref pos numerators) ptag
  (13) { f read2 =only } (shared obj ref pos denominator) ptag

  (*1) { [ npages { f nb3 readn } repeat ] ==only } (# objs/page deltas (see 1,3)) ptag
  (*2) { [ npages { f nb5 readn } repeat ] ==only } (# bytes/page deltas (see 4,5)) ptag
  (*3) { [ npages { f nb10 readn } repeat ] dup ==only /nso exch def } (# of shared obj refs (see 10)) ptag
  (*4) { [ nso { [ exch { f nb11 readn } repeat ] } forall ] ==only } (shared obj indices (see 11)) ptag
  (*5) { [ nso { [ exch { f nb12 readn } repeat ] } forall ] ==only } (shared obj ref pos numerators (see 12)) ptag
  (*6) { [ npages { f nb7 readn } repeat ] ==only } (content stream offset-in-page deltas (see 6,7)) ptag
  (*7) { [ npages { f nb9 readn } repeat ] ==only } (content stream length deltas (see 8,9)) ptag

  end		% temp dict

} bind def

% Print the Shared Objects Hint Table.
/psoht {	% <file> psoht -

  20 dict begin
  /f exch def
  readninit

  (1) { f read4 =only } (first shared obj #) ptag
  (2) { f read4 =only } (first shared obj offset (+PHS length if beyond PHS)) ptag
  (3) { f read4 dup =only /n3 exch def } (# of p. 1 shared objs) ptag
  (4) { f read4 dup =only /n4 exch def } (total # of shared objs) ptag
  (5) { f read2 dup =only /nb5 exch def } (# bits for # of shared objs/group) ptag
  (6) { f read4 =only } (least shared obj group length) ptag
  (7) { f read2 dup =only /nb7 exch def } (# bits for shared obj group length delta) ptag

  /nse n4 def
  (*1) { [ nse { f nb7 readn } repeat ] ==only } (shared obj group length deltas (see 6,7)) ptag
  (*2) { [ nse { f 1 readn } repeat ] dup ==only /md5s exch def } (MD5 present?) ptag
  (*3:) = md5s {
    0 ne {
      (  ) print f 16 string readstring pop
      (%stdout) (w) file dup 3 -1 roll writehexstring closefile () =
    } if
  } forall
  (*4) { [ nse { f nb5 readn } repeat ] ==only } (# objs/group (see 5)) ptag

  end		% temp dict

} bind def

% Print the Primary Hint Stream of a PDF file.
/pphs {		% <file> pphs -
  /pdf exch def

	% Read the linearization parameter dictionary.
  { pdf pdftoken /obj eq { exit } if } loop
  pdf pdftoken /lpdict exch def
  /lpdict type /dicttype eq { lpdict /Linearized known } { false } ifelse {
    (Not a linearized PDF file.) = stop
  } if

  lpdict plpdict flush

	% Read the primary hint stream.
  null {
    pdf pdftoken dup /stream eq { pop exit } if
    exch pop
  } loop
  /phsdict exch def
	% Remove Length if indirect reference.
  phsdict 0 known {
    phsdict 0 undef  phsdict /Length undef
  } if
  (PHS: ) print phsdict === flush
  pdf 0 (endstream) /SubFileDecode filter
  dup 5000 string readstring pop exch closefile
  sread /phsdata exch def

	% Decode the hint stream data if necessary.
  phsdict /Filter .knownget {
    phsdata exch filter
    dup 5000 string readstring pop exch closefile
    sread /phsdata exch def
  } if

	% Adobe says we can assume /P = 0.
  (Page Offset Hint Table:) =
  lpdict /N get
  phsdata phsdict /S get string readstring pop sread
  ppoht
  (Shared Objects Hint Table:) =
  phsdata psoht
} bind def

% Check for command line arguments.
[ shellarguments
 { ] dup length 1 eq
    { 0 get (r) file dup pphs closefile }
    { (Usage: pphs filename.pdf\n) print flush }
   ifelse
 }
 { pop }
ifelse
n0<%0 n* n#UOHnBHn0<	06 JCgp `vUOHn0<0UOHn/<fselHn0<06 JCgp `FUOHn0<06 UOHnBHx BgHx xBB0<
06 UOHn0<0WD HLN^NuNVUO/. HnpR0gp `</. /./.N J@O fp` /. /.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %!
%%Creator: Eric Gisin <egisin@waterloo.csnet>
%%Title: Print font catalog
% Copyright (c) 1986 Eric Gisin
% Copyright (C) 1992 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to print all 256 encoded characters.
% Copyright (C) 1993 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to print unencoded characters.
% Copyright (C) 1994 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to always create 256-element Encoding vectors.
% Copyright (C) 1995 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to print more than 128 unencoded characters.
% Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to leave a slightly wider left margin, because many H-P
%     printers can't print in the leftmost 1/4" of the page.
%   Modified to print unencoded characters in any font that has CharStrings.
% Copyright (C) 1999 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to sort unencoded characters.
% Copyright (C) 2000 Aladdin Enterprises, Menlo Park, CA (ghost@aladdin.com)
%   Modified to print CIDFonts as well as fonts.
%   O(N^2) sorting replaced with O(N log N).

% $Id: prfont.ps,v 1.2.6.1 2002/04/02 13:57:27 mpsuzuki Exp $

% Example usages at bottom of file

/#copies 1 def
/min { 2 copy gt { exch } if pop } bind def

/T6 /Times-Roman findfont 6 scalefont def
/Temp 64 string def
/Inch {72 mul} def
/Base 16 def	% char code output base
/TempEncoding [ 256 { /.notdef } repeat ] def

% Sort an array.  Code used by permission of the author, Aladdin Enterprises.
/sort {			% <array> <lt-proc> sort <array>
	% Heapsort (algorithm 5.2.3H, Knuth vol. 2, p. 146),
	% modified for 0-origin indexing. */
  10 dict begin
  /LT exch def
  /recs exch def
  /N recs length def
  N 1 gt {
    /l N 2 idiv def
    /r N 1 sub def {
      l 0 gt {
	/l l 1 sub def
	/R recs l get def
      } {
	/R recs r get def
	recs r recs 0 get put
	/r r 1 sub def
	r 0 eq { recs 0 R put exit } if
      } ifelse
      /j l def {
	/i j def
	/j j dup add 1 add def
	j r lt {
	  recs j get recs j 1 add get LT { /j j 1 add def } if
	} if
	j r gt { recs i R put exit } if
	R recs j get LT not { recs i R put exit } if
	recs i recs j get put
      } loop
    } loop
  } if recs end
} def

% do single character of page
% output to rectangle ll=(0,-24) ur=(36,24)
/DoGlyph {	% C, N, W set

  % print code name, width and char name
  T6 setfont
  N /.notdef ne {0 -20 moveto N Temp cvs show} if
  0 -12 moveto C Base Temp cvrs show (  ) show
  W 0.0005 add Temp cvs 0 5 getinterval show

  % print char with reference lines
  N /.notdef ne {
    3 0 translate
    0 0 moveto F24 setfont N glyphshow
    /W W 24 mul def
    0 -6 moveto 0 24 lineto
    W -6 moveto W 24 lineto
    -3 0 moveto W 3 add 0 lineto
    0 setlinewidth stroke
  } if
} def
/DoChar {
  /C exch def
  /N F /Encoding get C get def
  /S (_) dup 0 C put def
  /W F setfont S stringwidth pop def
  DoGlyph
} def
/CIDTemp 20 string def
/DoCID {
  /N exch def
  /C N def
  /W F setfont gsave
    matrix currentmatrix nulldevice setmatrix
    0 0 moveto N glyphshow currentpoint pop
  grestore def
  DoGlyph
} def

% print page title
/DoTitle {
  /Times-Roman findfont 18 scalefont setfont
  36 10.5 Inch moveto FName Temp cvs show ( ) show ((24 point)) show
} def

% print one block of characters
/DoBlock {	% firstcode lastcode
  /FirstCode 2 index def
  1 exch {
    /I exch def
    /Xn I FirstCode sub 16 mod def /Yn I FirstCode sub 16 idiv def
    gsave
    Xn 35 mul 24 add Yn -56 mul 9.5 Inch add translate
    I DoCode
    grestore
  } for
} def

% print a line of character
/DoCharLine {	% firstcode lastcode
  1 exch { (_) dup 0 3 index put show pop } for
} def
/DoCIDLine {	% firstcode lastcode
  1 exch { glyphshow } for
} def

% initialize variables
/InitDoFont {	% fontname font
  /F exch def		% font
  /FName exch def	% font name
  /F24 F 24 scalefont def
  /Line0 96 string def
  /Line1 96 string def
  /Namestring1 128 string def
  /Namestring2 128 string def
} def

% print pages of unencoded characters
/DoUnencoded {	% glyphs
  /Unencoded exch def
  /Count Unencoded length def

		% Print the unencoded characters in blocks of 128.

  0 128 Unencoded length 1 sub
   { /BlockStart 1 index def
     dup 128 add Unencoded length .min 1 index sub
     Unencoded 3 1 roll getinterval TempEncoding copy
     /BlockEncoding exch def
     /BlockCount BlockEncoding length def
     save
     F /Encoding known {
       F length dict F
	{ 1 index /FID eq { pop pop } { 2 index 3 1 roll put } ifelse }
       forall dup /Encoding TempEncoding put
       /* exch definefont
       /F exch def
       /F24 F 24 scalefont def
       /BlockStart 0 def
     } if

     DoTitle (, unencoded characters) show
     BlockStart dup BlockCount 1 sub add DoBlock
     F 10 scalefont setfont
     36 2.4 Inch moveto
    0 32 BlockCount 32 sub 224 .min {
      0 -0.4 Inch rmoveto gsave
      dup 31 add BlockCount 1 sub .min
      exch BlockStart add exch BlockStart add DoLine
      grestore
    } for
     showpage
     restore
   } for

} def

% print font sample pages
/DoFont {
  dup findfont InitDoFont
  /DoCode {DoChar} def
  /DoLine {DoCharLine} def

	% Display the first 128 encoded characters.

  DoTitle (, characters 0-127) show
  0 127 DoBlock
  F 10 scalefont setfont
  36 2.0 Inch moveto 0 63 DoLine
  36 1.5 Inch moveto 64 127 DoLine
  showpage

	% Display the second 128 encoded characters.

  DoTitle (, characters 128-255) show
  128 255 DoBlock
  F 10 scalefont setfont
  36 2.0 Inch moveto 128 191 DoLine
  36 1.5 Inch moveto 192 255 DoLine
  showpage

  F /CharStrings known
   {
		% Find and display the unencoded characters.

	/Encoded F /Encoding get length dict def
	F /Encoding get { true Encoded 3 1 roll put } forall
	[ F /CharStrings get
	 { pop dup Encoded exch known { pop } if }
	forall ] {
	  exch Namestring1 cvs exch Namestring2 cvs lt
	} sort DoUnencoded

   }
  if

} def

% print CIDFont sample pages
/DoCIDFont {
  dup /CIDFont findresource InitDoFont
  /DoCode {DoCID} def
  /DoLine {DoCIDLine} def

  [ 0 1 F /CIDCount get 1 sub { } for ] DoUnencoded
} def

% Do font samples
% /Times-Roman DoFont			% Test (less than a minute)
% /Hershey-Gothic-English DoFont	% Test (8 minutes)

% Do a complete catalog
% FontDirectory {pop DoFont} forall	% All fonts (quite a long time)
0/
Hx /<  
NX)@VJO o ,V"<  N\)@V/
Hx  /<  N*Ѐ9@Z/
Hx P/<  NЀ9@\JlZO n9| Zl \m9| \`0< l\"<   9A\Jl\n9| \p\2 II@A9A^A o9| ^l ^l9| ^/
Hx /<  N)@`JO o ,`"<  Nڔ)@`/
Hx/<  Nb"<                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  %!
% written by James Clark <jjc@jclark.uucp>

% print an afm file on the standard output
% usage is `fontname printafm' eg `/Times-Roman printafm'

% From the `dvitops' distribution, which included this notice:
% dvitops is not copyrighted; you can do with it exactly as you please.
% I would, however, ask that if you make improvements or modifications,
% you ask me before distributing them to others.

% Altered by d.love@dl.ac.uk to produce input for Rokicki's afm2tfm,
% which groks the format of the Adobe AFMs.

% $Id: printafm.ps,v 1.1.6.1 2002/04/10 09:22:58 giles Exp $

% Modified by L. Peter Deutsch 9/14/93:
%   uses Ghostscript's =only procedure to replace 'buf cvs print'.
% Modified by L. Peter Deutsch 9/6/95:
%   uses Ghostscript's shellarguments facility to accept the font name
%     on the command line.

/onechar 1 string def

% c toupper - c
/toupper {
	dup dup 8#141 ge exch 8#172 le and { 
		8#40 sub
	} if
} bind def

% printcharmetrics -

/printcharmetrics {
	(StartCharMetrics ) print
	currentfont /CharStrings get dup length exch /.notdef known { 1 sub } if =
	currentfont 1000 scalefont setfont 0 0 moveto
	/e currentfont /Encoding get def
	0 1 255 {
		dup e exch get
		dup /.notdef ne {
			exch dup printmetric
		} {
			pop pop
		} ifelse
	} for
	% s contains an entry for each name in the original encoding vector
	/s 256 dict def
	e {
		s exch true put
	} forall
	% v is the new encoding vector
	/v 256 array def
	0 1 255 {
		v exch /.notdef put
	} for
	% fill up v with names in CharStrings
	/i 0 def
	currentfont /CharStrings get {
		pop
		i 255 le {
			v i 3 -1 roll put
			/i i 1 add def
		} {
			pop
		} ifelse
	} forall
	% define a new font with v as its encoding vector
	currentfont maxlength dict /f exch def
	currentfont {
		exch dup dup /FID ne exch /Encoding ne and { 
			exch f 3 1 roll put
		} { 
			pop pop 
		} ifelse
	} forall
	f /Encoding v put
	f /FontName /temp put
	% make this new font the current font
	/temp f definefont setfont
	% print a entry for each character not in old vector
	/e currentfont /Encoding get def
	0 1 255 {
		dup e exch get
		dup dup /.notdef ne exch s exch known not and { 
			exch -1 printmetric
		} { 
			pop pop
		} ifelse
	} for
	(EndCharMetrics) =
} bind def

% name actual_code normal_code printmetric -

/printmetric {
	/saved save def
	(C ) print =only
	( ; WX ) print
	onechar 0 3 -1 roll put
	onechar stringwidth pop round cvi =only
	( ; N ) print =only
	( ; B ) print
	onechar false charpath flattenpath mark pathbbox counttomark {
		counttomark -1 roll
		round cvi =only
		( ) print
	} repeat pop
	(;) =
	saved restore
} bind def

% fontname printafm -

/printafm {
	findfont gsave setfont
	(StartFontMetrics 2.0) =
	(FontName ) print currentfont /FontName get =

		% Print the FontInfo

	currentfont /FontInfo get {
		exch
		=string cvs dup dup 0 get 0 exch toupper put print
		( ) print =
	} forall

		% Print the FontBBox

	(FontBBox) print
	currentfont /FontBBox get {
		( ) print round cvi =only
	} forall
	(\n) print

	printcharmetrics
	(EndFontMetrics) =
	grestore
} bind def

% Check for command line arguments.
[ shellarguments
 { ] dup length 1 eq
    { 0 get printafm }
    { (Usage: printafm fontname\n) print flush }
   ifelse
 }
 { pop }
ifelse
bHnHnHxHx !bHnHnHx/, 
HnHl  B'HnN\ORCDo  L8N^ _\ONNVH0YO2 _$H R&h  Sh   n
 R(   fp ` Fv `  0C  l  P-h 
=h YOHn3 / Hn40.nc
0.n`0.n@  bX0.nc
0.n`0.n@  b60.nc
0.n`0.n@  bRC l  P0( R@@m \ l  P0( R@@mp `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %!
%    Copyright (C) 1994 , 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: ps2ai.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%
%   ps2ai.ps - a postscript to editable adobe illustrator file filter
%
/vers {2.14} def                  %                    January 31, 1999

% conditional def ( if the key is already defined before, don't 
% redefine it. This can be used by other programs to overwrite
% some settings from externally
%  
/cdef { 1 index where { pop pop pop } { def } ifelse } def
%
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%
% needs a postscript level 2 interpreter, like gnu ghostscript, to work
%
%      Usage:   gs -q -dNODISPLAY ps2ai.ps file.ps > file.aips
%                              or (see below)
%               gs -q -dNODISPLAY ps2ai.ps file.ps
%                              or
%               cat ps2ai.ps file.ps | lpr  (then look in log file)
%
% or from within gsview via:
% 	Edit->Convert to vector format
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%                            Options
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%   Output Options: directly to a file or standard out
%
/jout false cdef            % true=file  false=stdout (default=false)
/joutput (ps2ai.out.aips) cdef      % Name of Output file
%
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%
%              Other Options
%
/jtxt3 true cdef           % output text in AI3 form (false=ai88)
                          % for coreldraw/photoshop readable output
/joutln false cdef         % use font outline  instead of font
/jerr false def            % use error handling (ie die gracefully)
/jbiterr false def         % attempt to handle bitmap fonts (kludge)
/jMacGS false def         % true if using MacGS (not fully implemented yet)
/jMacfix true def         % convert filled boxes to lines (only usefull with
                          % laserwriter 8 postscript input)

%
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%                    No options below here
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%
%         - Notes -
%  ai uses cmykcolor, so level 1 interpreters don't work
%  ai doesn't use image/imagemask - so bitmaps don't work correctly
%  the output file has a header so it is viewable/printable/reconvertable
%
% Comments, suggestions, bug-fixes, etc send to:
%
%        Jason Olszewski (olszewsk@splash.princeton.edu)
%
% anonymous ftp: toby.princeton.edu /pub/olszewsk/ps2ai.ps
%       URL ftp://toby.princeton.edu/pub/olszewsk
%
%         - Fix History -
%  2.14 added cdef to allow overwriting of certain values from externally
%  2.13 check for bitmap fonts, work better with TeX,WinPS,etc
%  2.12 fixed initclip to US letter size page
%  2.11 added header support for *u/*U compound paths
%  2.1  option of font outline instead of text(gwhite@trevnx.bio.dfo.ca)
%  2.0  major change to complex path handling
%  1.9  fixed text leaking ascii (,),\
%  1.85 added default font to handle no setfont (Courier)
%  1.84 added even-odd fill/clip (D)
%  1.83 undefined PPD PageSize printer specific info
%  1.82 added kludge to save clipping status through a restore
%  1.81 added custom color/gray support to header (x/X, g/G)
%  1.8  added newpath if clippath is not consumed correctly(amiga)
%  1.79 eliminated scientific notation of numbers less than 0.0001
%  1.78 fixed transposed h & H
%  1.77 made laserwriter 8 fixes optional
%  1.76 added margin fix for unix AI (brown@wi.extrel.com)
%  1.75 added kludge to handle bitmap font errors (TeX, Windows.ps)
%  1.74 made grestore a little smarter
%  1.73 included header handle encoded fontname (/_fontname)
%  1.72 fixed problem with restore/clip info - (not enough Qs problem)
%  1.71 filter font names to remove previous encoding (|,_,etc)
%  1.7  change text format to AI3, works better with PS & CD
%  1.67 deal with weird makefonts 
%  1.66 handle to many bad stroke/fills (s s s w/o paths)
%  1.65 more useable with non-gs interpreters (defaultmatrix fix)
%  1.64 fixed "smart grestore" repeat bug
%  1.63 fixed ashow/awidthshow bug
%  1.62 check if cmykcolor is understood otherwise rgb
%  1.61 made grestore smarter (only print if different)
%  1.6  add better compatibility to CorelDraw and PhotoShop
%  1.53 make it more gs-backward compatible (clarke@lsl.co.uk)
%  1.52 handle clipping paths a little better (Posted)
%  1.51 improve mac lw8 output (lines instead of filled boxes)
%  1.5 handle some level 2 stuff (mac lw8)
%  1.4 fixed scaling of linewidth and dash
%  1.31 made trailer more AI88 friendly
%  1.3 add ablity to output to file directly
%  1.21 print matrix cleaner
%  1.2 fix rotated fonts, thanks to G.Cameron (g.cameron@biomed.abdn.ac.uk)
%  1.1 fix stroke/fill color difference (k vs K)
%  1.0 posted to comp.lang.postscript
%
%         - To Do List -
%  find real %%BoundingBox: llx lly urx ury
%  make MacGS friendly (line-endings)
%  handle eps w/o showpage:(append to end)
%  write out image data to external file
%
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
%                  Nothing of Interest below here
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
matrix identmatrix setmatrix %   make ctm [1 0 0 1 0 0]
/oldgsave {} def /oldgrestore {} def
/initgraphics {} def /initmatrix {} def 
% undefine PPD PageSizes to be more printer independant
/letter {} def /legal {} def /a4 {} def /b5 {} def /lettersmall {} def
/setpagedevice { pop } def % for level 2 PPD PageSizes
/Courier findfont 12 scalefont setfont % handle no setfont
/initclip {0 0 moveto 0 792 lineto 612 792 lineto 612 0 lineto closepath
           clip newpath } def
/xdef {exch def} def
/trx {transform exch} def
/cbdef {cvx bind def} def
/jltz {dup abs 0.0001 lt {pop 0} if} def % get rid of scientific notation bug
/clstate false def        % closepath state
/dpth false def           % destroy path (ie newpath)
/fclp false def           % first paint after clip
/kscl {1.0} def           % default current scale X-factor
/gcnt {1} def             % graphics state counter
/spth {1} def             % multiple paths on stack
/jeol (\n) def            % default end-of-line
/jnump {0} def            % number of paths on stack
/jx {0} def /jy {0} def /j_ax {0} def
/j3ftxt true def
/clarry 10 array def
0 1 9 {clarry exch false put} for % initilize no clipping path
%
% handle cmyk color on level 1 interpreters
/setcmykcolor where {pop}
 {/setcmykcolor {
   /blk exch def /yel exch def /mag exch def /cyan exch def
   /ccomp {add dup 1 gt {pop 1} if} def
   /red {1 cyan blk ccomp sub} def
   /green {1 mag blk ccomp sub} def
   /blue {1 yel blk ccomp sub} def
   red green blue setrgbcolor
  } def
} ifelse
/currentcmykcolor where {pop}
 {/currentcmykcolor {
   currentrgbcolor /bval xdef /gval xdef /rval xdef
   /rawC 1 rval sub def /rawM 1 gval sub def /rawY 1 bval sub def
   rawC rawM ge { rawY rawM ge { /blk rawM def} if } if
   rawC rawY ge { rawM rawY ge { /blk rawY def} if } if
   rawY rawC ge { rawM rawC ge { /blk rawC def} if } if
   rawY rawC eq { rawM rawC eq { /blk rawC def} if } if
   /cyan  rawC blk sub  def
   /mag  rawM blk sub  def
   /yel  rawY blk sub  def
   /blk blk def
   cyan mag yel blk
  } def
} ifelse
% If using Mac Ghostscript 
jMacGS { 
%        /jeol {(\r) jp} def
        /jout true def
        (%%Note: Loading ps2ai.ps\n) print
       } if
/jstr 40 string def
jout {joutput (w) file /joutput xdef} if
%
%              Output
%
jout {/jp { joutput exch writestring } bind def }{/jp {print}bind def} ifelse
/jpnum {jltz ( ) jp =string cvs jp } bind def
/jpmat { dup /jarry exch def length 1 sub /j_num exch def
 (\[) jp 0 1 j_num {jarry exch get jpnum} for (\]) jp } def
%
%              Stack to Paths converters
%
/ckpnt { % check which paint and clipping to use
   dpth {  % if there are multiple paths on the stack
  clarry gcnt get fclp and {clstate {(h W\n) jp }{(H W\n) jp } ifelse} if
  spth 0 eq {clstate {(n\n) jp }{(N\n) jp } ifelse} if
  spth 1 eq {clstate {(s\n) jp }{(S\n) jp } ifelse} if
  spth 2 eq {clstate {(f\n) jp }{(F\n) jp } ifelse} if
     } if
} def
/jpm {
  ckpnt
  /dpth true def
  transform 2 copy /yst xdef /xst xdef exch jpnum jpnum ( m\n) jp } bind def
/jpl { trx jpnum jpnum ( l\n) jp } bind def
/jpc {  6 4 roll trx jpnum jpnum 4 2 roll trx jpnum jpnum trx
    jpnum jpnum ( c\n) jp } bind def
/jpp {xst jpnum yst jpnum ( l\n) jp /clstate true def} def
/cntpaths { % count paths on stack
  oldgsave
  {pop pop /jnump jnump 1 add def} {pop pop} {6 {pop} repeat}{} pathforall
  oldgrestore
} def
/ppforall {
 cntpaths % find out how many paths are on the stack
 jnump 1 gt { (*u\n) jp } if
 {jpm}{jpl}{jpc}{jpp} pathforall 
  ckpnt
 jnump 1 gt { (*U\n) jp } if
 /jnump 0 def /clstate false def /dpth false def /fclp false def
  oldnewpath
} bind def
%
%              Painting Operators
%
/oldnewpath [/newpath load] cbdef
/newpath { (\n) jp /spth 0 def ppforall} def 
/stroke { (\n) jp /spth 1 def ppforall } def 
/fill   {(\n) jp /spth 2 def ppforall } def 
/eofill {(1 D\n) jp fill (0 D\n) jp} def
/clip {clarry gcnt get {(Q\nq\n) jp}{(q\n) jp} ifelse 
                   /fclp true def clarry gcnt true put} def
/eoclip {(1 D\n) jp clip (0 D\n) jp} def
%
%               Text Operators
%
/oldshow [/show load] cbdef
/curpt {stringwidth pop jx add jy} def 
/jNN {dup 0 eq {pop oldgsave currentfont /FontMatrix get setmatrix kscl
                oldgrestore} if
} def
/curftmatrix {
 currentfont /FontMatrix get dup 0 get jNN abs /norm exch def 
 dup 0 get norm div exch dup
 1 get norm div exch dup 2 get norm div exch dup 3 get norm div exch dup
 4 get exch 5 get 6 array astore matrix currentmatrix matrix concatmatrix
} def
% AI does not support negitive font sizes
/curftsize {currentfont /FontMatrix get 0 get jNN abs 1000 mul} def
/hstr (X) def
/vbar (|) 0 get def /undsc (_) 0 get def
/ftnamefix { % handle font names with |,_ (previously encoded)
jstr cvs
{ %forall
        dup vbar eq {pop}{ %ifelse
            dup undsc eq {pop}{ %ifelse
                    hstr exch 0 exch put hstr jp
            } ifelse
        } ifelse
   } forall   flush
} bind def
%/curftname {currentfont /FontName get ftnamefix}def
/curftname { currentfont /FontName known {currentfont /FontName get}
           { (Times-Roman)} ifelse ftnamefix } def
/lftpar (\() 0 get def
/rhtpar (\)) 0 get def
/bckslsh (\\) 0 get def
/handft { % handle strings with (,),\
   (\() jp
   { %forall
        dup lftpar eq { (\\\() jp }{ %ifelse
            dup rhtpar eq { (\\\)) jp }{ %ifelse
                dup bckslsh eq { (\\\\) jp }{ %ifelse
                    hstr exch 0 exch put hstr jp
                } ifelse
            } ifelse
        } ifelse
   } forall (\)) jp flush
} bind def
% AI 3 text format pieces
jtxt3 {
/j3txt { j3ftxt {(0 Ts 100 Tz 0 Tt 0 TA 0 0 5 TC 100 100 200 TW 0 0 0 Ti\n) jp
                (0 Ta 0 Tq 0 0 TI 0 Tc 0 Tw\n) jp} if } def
/show {oldgsave  (0 To\n) jp 
  currentpoint 2 copy /jy exch def /jx exch def translate 
  curftmatrix /jitm exch def
  0 1 5 {jitm exch get jpnum} for ( 0 Tp\n) jp (TP\n) jp
  (0 Tr\n) jp (\/_) jp curftname  curftsize jpnum ( Tf\n) jp
  (0) jp j_ax  curftsize div 100 mul jpnum ( 100 TC\n) jp %  percent(?)
  dup curpt moveto mark exch handft ( Tx\n) jp (TO\n) jp /j3ftxt false def
  cleartomark currentpoint oldgrestore moveto
} def  
/ashow {exch pop exch /j_ax exch def show /j_ax {0} def } def
} 
 {
/show {oldgsave (u\n) jp currentpoint 2 copy /jy exch def /jx exch def translate
  (\/) jp curftname jstr cvs jp
  curftsize dup jpnum  jpnum ( 0 0 z\n) jp
  curftmatrix jpmat ( e\n) jp
  dup curpt moveto mark exch handft ( t T U\n) jp
  cleartomark currentpoint oldgrestore moveto} def
/ashow {oldgsave (u\n) jp currentpoint translate (\/) jp curftname jstr cvs jp
  curftsize dup jpnum jpnum  exch kscl mul jpnum ( 0 z\n) jp
  curftmatrix jpmat ( e\n) jp dup curpt moveto mark exch handft
  ( t T U\n) jp cleartomark currentpoint oldgrestore moveto} def
} ifelse
/widthshow { show pop pop pop} def
/awidthshow {ashow pop pop pop} def
/kshow {show pop} def
%/show {true charpath fill} bind def   % get outline of charactor
joutln {/show { true charpath currentpoint 
     /jy exch def /jx exch def fill jx jy moveto} bind def} if
%/show {oldshow} def    % do nothing different
%
%               Color Operators
%
/oldsetcmykcolor [/setcmykcolor load] cbdef
/setcmykcolor {oldsetcmykcolor 
currentcmykcolor 4 -1 roll jpnum 3 -1 roll jpnum 2 -1 roll jpnum jpnum ( k\n) jp
currentcmykcolor 4 -1 roll jpnum 3 -1 roll jpnum 2 -1 roll jpnum jpnum ( K\n) jp
 } def
/oldsetgray [/setgray load] cbdef
/setgray {0 0 0 4 -1 roll 1 exch sub setcmykcolor} def
/oldsethsbcolor [/sethsbcolor load] cbdef
/sethsbcolor {oldsethsbcolor currentcmykcolor setcmykcolor} def
/oldsetrgbcolor [/setrgbcolor load] cbdef
/setrgbcolor {oldsetrgbcolor currentrgbcolor /bval xdef /gval xdef /rval xdef
 /rawC 1 rval sub def /rawM 1 gval sub def /rawY 1 bval sub def
 rawC rawM ge { rawY rawM ge { /blk rawM def} if } if
 rawC rawY ge { rawM rawY ge { /blk rawY def} if } if
 rawY rawC ge { rawM rawC ge { /blk rawC def} if } if
 rawY rawC eq { rawM rawC eq { /blk rawC def} if } if
 /cyan  rawC blk sub  def
 /mag  rawM blk sub  def
 /yel  rawY blk sub  def
 /blk blk def
 cyan mag yel blk setcmykcolor } def
%
%                State Operators
%
/oldsetlinewidth [/setlinewidth load] cbdef
/setlinewidth {kscl abs mul jltz  oldsetlinewidth
 currentlinewidth jpnum ( w\n) jp } def
/oldsetlinecap [/setlinecap load] cbdef
/setlinecap {dup oldsetlinecap jpnum ( J\n) jp} def
/oldsetlinejoin [/setlinejoin load] cbdef
/setlinejoin {dup oldsetlinejoin jpnum ( j\n) jp} def
/oldsetmiterlimit [/setmiterlimit load] cbdef
/setmiterlimit {dup oldsetmiterlimit jpnum ( M\n) jp}def
/oldsetdash [/setdash load] cbdef
/setdash {exch [ exch {kscl abs mul} forall ] exch kscl abs mul oldsetdash
  currentdash exch jpmat jpnum ( d\n) jp } def
/oldsetflat [/setflat load] cbdef
/setflat {dup oldsetflat jpnum ( i\n) jp } def
%
%                More State Operators
%
/kscl { % use just the x scale factor
 oldgsave
 matrix currentmatrix /jctm exch def
 jctm 4 0 put jctm 5 0 put jctm setmatrix
 1 0 moveto currentpoint transform
 dup mul exch dup mul add sqrt 10000 mul round 10000 div
 oldgrestore
} def
/currentstate {currentcmykcolor setcmykcolor
 currentflat jpnum ( i) jp currentlinecap jpnum ( J) jp
 currentlinejoin jpnum ( j) jp currentlinewidth jpnum ( w) jp
 currentmiterlimit jpnum ( M ) jp currentdash exch jpmat jpnum ( d\n) jp 
} def
/jdifG {
 currentcmykcolor /jok xdef /joy xdef /jom xdef /joc xdef
 currentflat /jof xdef currentlinecap /jolc xdef currentlinejoin /jolj xdef
 currentlinewidth /jolw xdef currentmiterlimit /joml xdef
 currentdash /jood xdef /joad xdef
 oldgrestore
 currentcmykcolor /jnk xdef /jny xdef /jnm xdef /jnc xdef
 currentflat /jnf xdef currentlinecap /jnlc xdef currentlinejoin /jnlj xdef
 currentlinewidth /jnlw xdef currentmiterlimit /jnml xdef
 currentdash /jnod xdef /jnad xdef
 % compare old gstate to new gstate
 joc jnc ne jom jnm ne joy jny ne jok jnk ne
 jof jnf ne jolc jnlc ne jolj jnlj ne jolw jnlw ne joml jnml ne 
 false joad {true exit} forall {pop pop true}{false} ifelse
 false jnad {true exit} forall {pop pop true}{false} ifelse ne
 jood jnod ne 10 {or} repeat {currentstate} if
} def
/oldgsave [/gsave load] cbdef
/gsave {oldgsave /gcnt gcnt 1 add def } def % clarry gcnt false put} def
%  (%%Note:gsave ) jp gcnt jpnum (\n) jp} def
/oldgrestore [/grestore load] cbdef
/grestore {dpth {newpath} if clarry gcnt get {(Q\n) jp clarry gcnt false put} if 
 jdifG /gcnt gcnt 1 sub def } def
% oldgrestore currentstate } def
% (%%Note:grestore ) jp gcnt 1 add jpnum (\n) jp} def
/oldrestore [/restore load] cbdef
% a kludgy way of saving the clipping path status information
/restore {clarry aload pop 11 -1 roll oldrestore clarry astore pop} def
/showpage {  0 1 9 {clarry exch get {(Q\n) jp} if } for
 (%%Note: If Error, make sure there are matched pairs of 'q's and 'Q's\n) jp
 (%%Note: in the file. Add 'Q's before '%%Trailer' until equal\n) jp
 (%%Trailer\n) jp
 jtxt3 {(Adobe_IllustratorA_AI3 /terminate get exec\n) jp
        (Adobe_typography_AI3 /terminate get exec\n) jp
        (Adobe_customcolor /terminate get exec\n) jp
        (Adobe_cshow /terminate get exec\n) jp
        (Adobe_cmykcolor /terminate get exec\n) jp
        (Adobe_packedarray /terminate get exec\n) jp
}{
        (Adobe_Illustrator881 /terminate get exec\n) jp
        (Adobe_customcolor /terminate get exec\n) jp
        (Adobe_cshow /terminate get exec\n) jp
        (Adobe_cmykcolor /terminate get exec\n) jp
        (Adobe_packedarray /terminate get exec\n) jp 
       } ifelse
( showpage\n%EOF\n%%EndDocument\n) jp
 jout {joutput closefile} if jMacGS not {quit} if /j3ftxt true def } def 
%
%                Error handling
%
errordict begin
% Attempt to handle the error caused by bitmap fonts (TeX,Windows.ps,etc)
% this is a big-time kludge
jbiterr {
 /undefined {pop pop (Times-Roman)} def
 /typecheck {pop pop} def
} if
jerr {
 /handleerror {
  (%%Note: ps2ai error, aborting rest of conversion\n) jp showpage
 } def
} if
end
%
%                Mac LW 8 improvements
%
/jmacimp { % stroked line instead of thin filled boxes
 /@a {  3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch moveto
      3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll exch sub exch lineto
      abs setlinewidth  stroke pop pop} def
 /@b { 3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch moveto
      pop
      3 -1 roll 2 div dup 3 -1 roll add exch 3 -1 roll add exch lineto
      abs setlinewidth  stroke} def
 /endp {showpage pm restore} def % because the restore stops clean up
} def
%
%                Handle (some) PS Level 2
%
/rectstroke { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
  closepath stroke} def
/rectfill { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
  fill } def
/rectclip { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto
  closepath clip newpath jMacfix {jmacimp} if } def
%
% Add a header prolog to the output file so it is still view/print-able
%
(%!PS-Adobe-2.0 EPSF-1.2\n%%BoundingBox: 0 0 612 792\n) jp
(%%Title: Adobe Illustator 3 Editable Document\n) jp
(%%Creator: ps2ai.ps vers.) jp vers jpnum ( \(C\) 1993-94 Jason Olszewski\n) jp
(%%TemplateBox: 0 0 612 792\n) jp
jtxt3 {(%%AI3_Margin:0 0 0 0\n) jp } if
(%%EndComments\n) jp
(%%BeginProlog\n) jp
(/m {moveto} def /l {lineto} def /c {curveto} def\n) jp
(/S {stroke} def /F {fill} def\n) jp
(/s {closepath S} def /f {closepath F} def\n) jp
(/q {gsave} def /Q {grestore} def /W {clip} def /k {setcmykcolor} def\n) jp
(/i {setflat} def /J {setlinecap} def /j {setlinejoin} def\n) jp
(/w {setlinewidth} def /M {setmiterlimit} def /d {setdash} def\n) jp
(/u {gsave} def /U {grestore} def /K {k} def\n) jp
(/N {newpath} def /n {closepath N} def\n) jp
(/g {setgray} def /G {g} def\n) jp
(/x {pop pop k} def /X {x} def\n) jp
(/H {} def /h {H closepath} def /D {pop} def\n) jp
(/*u { /N {/spth 0 def}def /S{/spth 1 def}def /F {/spth 2 def} def} def\n) jp
(/*U { spth 0 eq {newpath} if spth 1 eq {stroke} if spth 2 eq {fill} if\n) jp
(     /N {newpath} def /S {stroke} def /F {fill} def  } def\n) jp
%(\n) jp
jtxt3 {
 (/TC {pop pop pop} def /Tr {pop} def\n) jp
 (/To {pop gsave} def /TO {grestore} def\n) jp
 (/Tp {pop matrix astore concat} def  /TP {0 0 moveto} def\n) jp
 (/a_str 40 string def /cnt 0 def /h_str (X) def /undsc (_) 0 get def\n) jp
 (/fntfix {a_str cvs dup length 1 sub /f_str exch string def\n) jp
 (  {dup undsc eq {pop}{f_str cnt 3 -1 roll put /cnt cnt 1 add def\n) jp
 (  } ifelse } forall flush /cnt 0 def f_str cvn } bind def\n) jp

 (/Tf {exch fntfix findfont exch scalefont setfont} def /Tx {show} def\n) jp
}{
 (/z {pop pop pop exch findfont exch scalefont setfont} def\n) jp
 (/e {concat 0 0 m} def /t {show} def /T {} def\n) jp
} ifelse
(\n) jp
jtxt3 {
 (userdict /Adobe_packedarray 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_cmykcolor 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_cshow 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_customcolor 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_typography_AI3 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_IllustratorA_AI3 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
}{
 (userdict /Adobe_packedarray 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_cmykcolor 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_cshow 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_customcolor 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
 (userdict /Adobe_Illustrator881 2 dict dup begin put\n) jp
 (/initialize {} def /terminate {} def\n) jp
} ifelse
(%%EndProlog\n) jp
(%%BeginSetup\n) jp
jtxt3 {
 (Adobe_packedarray /initialize get exec\n) jp
 (Adobe_cmykcolor /initialize get exec\n) jp
 (Adobe_cshow /initialize get exec\n) jp
 (Adobe_customcolor /initialize get exec\n) jp
 (Adobe_typography_AI3 /initialize get exec\n) jp
 (Adobe_IllustratorA_AI3 /initialize get exec\n) jp
}{
 (Adobe_packedarray /initialize get exec\n) jp
 (Adobe_cmykcolor /initialize get exec\n) jp
 (Adobe_cshow /initialize get exec\n) jp
 (Adobe_customcolor /initialize get exec\n) jp
 (Adobe_Illustrator881 /initialize get exec\n) jp
} ifelse
(%%EndSetup\n) jp
0 0 0 1 oldsetcmykcolor
currentstate

jout {(%%Note: Load Postscript file to be converted now\n) print} if
  j  P"S. j #5D                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1991, 1995, 1996, 1998, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: ps2ascii.ps,v 1.3.2.2 2002/04/02 13:57:27 mpsuzuki Exp $
% Extract the ASCII text from a PostScript file.  Nothing is displayed.
% Instead, ASCII information is written to stdout.  The idea is similar to
% Glenn Reid's `distillery', only a lot more simple-minded, and less robust.

% If SIMPLE is defined, just the text is written, with a guess at line
% breaks and word spacing.  If SIMPLE is not defined, lines are written
% to stdout as follows:
%
%	F <height> <width> (<fontname>)
%		Indicate the font height and the width of a space.
%
%	P
%		Indicate the end of the page.
% 
%	S <x> <y> (<string>) <width>
%		Display a string.
%
% <width> and <height> are integer dimensions in units of 1/720".
% <x> and <y> are integer coordinates, in units of 1/720", with the origin
%   at the lower left.
% <string> and <fontname> are strings represented with the standard
%   PostScript escape conventions.

% If COMPLEX is defined, the following additional types of lines are
% written to stdout.
%
%	C <r> <g> <b>
%		Indicate the current color.
%
%	I <x> <y> <width> <height>
%		Note the presence of an image.
%
%	R <x> <y> <width> <height>
%		Fill a rectangle.
%
% <r>, <g>, and <b> are RGB values expressed as integers between 0 and 1000.
%
% Note that future versions of this program (in COMPLEX mode) may add
%   other output elements, so programs parsing the output should be
%   prepared to ignore elements that they do not recognize.

% Note that this code will only work in all cases if systemdict is writable
% and if `binding' the definitions of operators defined as procedures
% is deferred.  For this reason, it is normally invoked with
%	gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT ps2ascii.ps

% Thanks to:
%    J Greely <jgreely@cis.ohio-state.edu> for improvements to this code;
%    Jerry Whelan <jerryw@abode.ccd.bnl.gov> for motivating other improvements;
%    David M. Jones <dmjones@theory.lcs.mit.edu> for improvements noted below.

%%  Additional modifications by David M. Jones
%%  (dmjones@theory.lcs.mit.edu), December 23, 1997
%%  
%%  (a) Rewrote forall loop at the end of .show.write.  This fixes a
%%      stack leakage problem, but the changes are more significant
%%      than that.  
%% 
%%      .char.map includes the names of all characters in the
%%      StandardEncoding, ISOLatin1Encoding, OT1Encoding and
%%      T1Encoding vectors.  Thus, if the Encoding vector for the
%%      current font contains a name that is not in .char.map, it's
%%      redundant to check if the Encoding vector is equal to one of
%%      the known vectors.  Previous versions of ps2ascii would give
%%      up at this point, and substitute an asterisk (*) for the
%%      character.  I've taken the liberty of instead using the
%%      OT1Encoding vector to translate the character, on the grounds
%%      that in the cases I'm most interested in, a font without a
%%      useful Encoding vector was most likely created by a DVI to PS
%%      converter such as dvips or DVILASER (and OT1Encoding is
%%      largely compatible with StandardEncoding anyway).  [Note that
%%      this does not make my earlier changes to support dvips (see
%%      fix (a) under my 1996 changes) completely obsolete, since
%%      there's additional useful information I can extract in that
%%      case.]
%%      
%%      Overall, this should provide better support for some documents
%%      (e.g, DVILASER documents will no longer be translated into a
%%      series of *'s) without breaking any other documents any worse
%%      than they already were broken.
%% 
%%  (b) Fixed two bugs in dvips.df-tail: (1) changed "dup 127" to "dup
%%      128" to fix fencepost error, and (2) gave each font it's own
%%      FontName rather than having all fonts share the same name.
%%  
%%  (c) Added one further refinement to the heuristic for detecting
%%      paragraph breaks: do not ever start a new paragraph after a
%%      line ending in a hyphen.
%% 
%%  (d) Added a bunch of missing letters from the T1Encoding,
%%      OT1Encoding and ISOLatin1Encoding vectors to .letter.chars to
%%      improve hyphen-elimination algorithm.  This still won't help
%%      if there's no useful Encoding vector.
%% 
%%  NOTE: A better solution to the problem of missing Encoding vectors
%%  might be to redefine definefont to check whether the Encoding
%%  vector is sensible and, if not, replace it by a default.  This
%%  would alleviate the need for constant tests in the .show.write
%%  loop, as well as automatically solving the problem noted in fix
%%  (d) above, and the similar problem with .break.chars.  This should
%%  be investigated.  Also, the hyphen-elimination algorithm really
%%  needs to be looked at carefully and rethought.

%%* Modifications to ps2ascii.ps by David M. Jones
%%* (dmjones@theory.lcs.mit.edu), June 25-July 8, 1996

%%* Modifications:
%%* 
%%* (a) added code to give better support for dvips files by providing
%%*     FontBBox's, FontName's and Encoding vectors for downloaded
%%*     bitmap fonts.  This is done by using dvips's start-hook to
%%*     overwrite the df-tail and D procedures that dvips uses to
%%*     define its Type 3 bitmap fonts.  Thus, this change should
%%*     provide better support for dvips-generated PS files without
%%*     affecting the handling of other documents.
%%* 
%%* (b) Fixed two bugs that could potentially affect any PS file, not
%%*     just those created by dvips: (1) added missing "get" operator
%%*     in .show.write and (2) fixed bug that caused a hyphen at the
%%*     end of a line to be replaced by a space rather than begin
%%*     deleted.  Note that the first bug was a source of stack
%%*     leakage, causing ps2ascii to run out of operand stack space
%%*     occasionally.
%%* 
%%*     Search for "%%* BF" to find these modifications.
%%*     
%%* (c) Improved the heuristic for determining whether a line break
%%*     has occurred and whether a line break represents a paragraph
%%*     break.  Previously, any change in the vertical position caused
%%*     a line break; now a line break is only registered if the
%%*     change is larger than the height of the current font.  This
%%*     means that superscripts, subscripts, and such things as
%%*     shifted accents generated by TeX won't cause line breaks.
%%*     Paragraph-recognition is now done by comparing the indentation
%%*     of the new line to the indentation of the previous line and by
%%*     comparing the vertical distance between the new line and the
%%*     previous line to the vertical distance between the previous
%%*     line and its predecessor.
%%*     
%%* (d) Added a hook for renaming the files where stdout and stderr
%%*     go.
%%* 
%%* In general, my additions or changes to the code are described in
%%* comments beginning with "%%*".  However, there are numerous other
%%* places where I have either re-formatted code or added comments to
%%* the code while I was trying to understand it.  These are usually
%%* not specially marked.
%%* 

/QUIET true def
systemdict wcheck { systemdict } { userdict } ifelse begin
/.max where { pop } { /.max { 2 copy lt { exch } if pop } bind def } ifelse
/COMPLEX dup where { pop true } { false } ifelse def
/SIMPLE dup where { pop true } { false } ifelse def
/setglobal where
 { pop currentglobal /setglobal load true setglobal }
 { { } }
ifelse

% Define a way to store and retrieve integers that survives save/restore.
/.i.string0 (0               ) def
/.i.string .i.string0 length string def
/.iget { cvi } bind def
/.iput { exch //.i.string exch copy cvs pop } bind def
/.inew { //.i.string0 dup length string copy } bind def

% We only want to redefine operators if they are defined already.

/codef { 1 index where { pop def } { pop pop } ifelse } def

% Redefine the end-of-page operators.

/erasepage { } codef
/copypage { SIMPLE { (\014) } { (P\n) } ifelse //print } codef
/showpage { copypage erasepage initgraphics } codef

% Redefine the fill operators to detect rectangles.

/.orderrect	% <llx> <lly> <urx> <ury> .orderrect <llx> <lly> <w> <h>
 {	% Ensure llx <= urx, lly <= ury.
   1 index 4 index lt { 4 2 roll } if
   dup 3 index lt { 3 1 roll exch } if
   exch 3 index sub exch 2 index sub
 } odef
/.fillcomplex
 {	% Do a first pass to see if the path is all rectangles in
	% the output coordinate system.  We don't worry about overlapping
	% rectangles that might be partially not filled.
	% Stack: mark llx0 lly0 urx0 ury0 ... true mark x0 y0 ...
   mark true mark
	% Add a final moveto so we pick up any trailing unclosed subpath.
   0 0 itransform moveto
    { .coord counttomark 2 gt
       { counttomark 4 gt { .fillcheckrect } { 4 2 roll pop pop }  ifelse }
      if
    }
    { .coord }
    { cleartomark not mark exit }
    { counttomark -2 roll 2 copy counttomark 2 roll .fillcheckrect }
   pathforall cleartomark
    { .showcolor counttomark 4 idiv
       { counttomark -4 roll .orderrect
	 (R ) //print .show==4
       }
      repeat pop
    }
    { cleartomark
    }
   ifelse
 } odef
/.fillcheckrect
 {	% Check whether the current subpath is a rectangle.
	% If it is, add it to the list of rectangles being accumulated;
	% if not exit the .fillcomplex loop.
	% The subpath has not been closed.
	% Stack: as in .fillcomplex, + newx newy
   counttomark 10 eq { 9 index 9 index 4 2 roll } if
   counttomark 12 ne { cleartomark not mark exit } if
   12 2 roll
	% Check for the two possible forms of rectangles:
	%	x0 y0  x0 y1  x1 y1  x1 y0  x0 y0
	%	x0 y0  x1 y0  x1 y1  x0 y1  x0 y0
   9 index 2 index eq 9 index 2 index eq and
   10 index 9 index eq
    {	% Check for first form.
      7 index 6 index eq and 6 index 5 index eq and 3 index 2 index eq and
    }
    {	% Check for second form.
      9 index 8 index eq and
      8 index 7 index eq and 5 index 4 index eq and 4 index 3 index eq and
    }
   ifelse not { cleartomark not mark exit } if
	% We have a rectangle.
   pop pop pop pop 4 2 roll pop pop 8 4 roll
 } odef
/eofill { COMPLEX { .fillcomplex } if newpath } codef
/fill { COMPLEX { .fillcomplex } if newpath } codef
/rectfill { gsave newpath .rectappend fill grestore } codef
/ueofill { gsave newpath uappend eofill grestore } codef
/ufill { gsave newpath uappend fill grestore } codef

% Redefine the stroke operators to detect rectangles.

/rectstroke
 { gsave newpath
   dup type dup /arraytype eq exch /packedarraytype eq or
    { dup length 6 eq { exch .rectappend concat } { .rectappend } ifelse }
    { .rectappend }
   ifelse stroke grestore
 } codef
/.strokeline	% <fromx> <fromy> <tox> <toy> .strokeline <tox> <toy>
		% Note: fromx and fromy are in output coordinates;
		% tox and toy are in user coordinates.
 { .coord 2 copy 6 2 roll .orderrect
	% Add in the line width.  Assume square or round caps.
   currentlinewidth 2 div dup .dcoord add abs 1 .max 5 1 roll
   4 index add 4 1 roll 4 index add 4 1 roll
   4 index sub 4 1 roll 5 -1 roll sub 4 1 roll
   (R ) //print .show==4
 } odef
/.strokecomplex
 {	% Do a first pass to see if the path is all horizontal and vertical
	% lines in the output coordinate system.
	% Stack: true mark origx origy curx cury
   true mark null null null null
    { .coord 6 2 roll pop pop pop pop 2 copy }
    { .coord 1 index 4 index eq 1 index 4 index eq or
       { 4 2 roll pop pop }
       { cleartomark not mark exit }
      ifelse
    }
    { cleartomark not mark exit }
    { counttomark -2 roll 2 copy counttomark 2 roll
      1 index 4 index eq 1 index 4 index eq or
       { pop pop 2 copy }
       { cleartomark not mark exit }
      ifelse
    }
   pathforall cleartomark
   0 currentlinewidth .dcoord 0 eq exch 0 eq or and
	% Do the second pass to write out the rectangles.
	% Stack: origx origy curx cury
    { .showcolor null null null null
       { 6 2 roll pop pop pop pop 2 copy .coord }
       { .strokeline }
       { }
       { 3 index 3 index .strokeline }
      pathforall pop pop pop pop
    }
   if
 } odef
/stroke { COMPLEX { .strokecomplex } if newpath } codef
/ustroke
 { gsave newpath
   dup length 6 eq { exch uappend concat } { uappend } ifelse
   stroke grestore
 } codef

% The image operators must read the input and note the dimensions.
% Eventually we should redefine these to detect 1-bit-high all-black images,
% since this is how dvips does underlining (!).

/.noteimagerect		% <width> <height> <matrix> .noteimagerect -
 { COMPLEX
    { gsave setmatrix itransform 0 0 itransform
      grestore .coord 4 2 roll .coord .orderrect
      (I ) //print .show==4
    }
    { pop pop pop
    }
   ifelse
 } odef
/colorimage where
 { pop /colorimage
    { 1 index
       { dup 6 add index 1 index 6 add index 2 index 5 add index }
       { 6 index 6 index 5 index }
      ifelse .noteimagerect gsave nulldevice //colorimage grestore
    } codef
 } if
/.noteimage		% Arguments as for image[mask]
 { dup type /dicttype eq
    { dup /Width get 1 index /Height get 2 index /ImageMatrix get }
    { 4 index 4 index 3 index }
   ifelse .noteimagerect
 } odef
/image { .noteimage gsave nulldevice //image grestore } codef
/imagemask { .noteimage gsave nulldevice //imagemask grestore } codef

% Output the current color if necessary.
/.color.r .inew def
  .color.r -1 .iput		% make sure we write the color at the beginning
/.color.g .inew def
/.color.b .inew def
/.showcolor
 { COMPLEX
    { currentrgbcolor
      1000 mul round cvi
      3 1 roll 1000 mul round cvi
      exch 1000 mul round cvi
		% Stack: b g r
      dup //.color.r .iget eq
      2 index //.color.g .iget eq and
      3 index //.color.b .iget eq and
       { pop pop pop
       }
       { (C ) //print
	 dup //.color.r exch .iput .show==only
         ( ) //print dup //.color.g exch .iput .show==only
         ( ) //print dup //.color.b exch .iput .show==only
	 (\n) //print
       }
      ifelse
    }
   if
 } bind def

% Redefine `show'.

% Set things up so our output will be in tenths of a point, with origin at
% lower left.  This isolates us from the peculiarities of individual devices.

/.show.ident.matrix matrix def
/.show.ident {		% - .show.ident <scale> <matrix>
%   //.show.ident.matrix defaultmatrix
%               % Assume the original transformation is well-behaved.
%   0.1 0 2 index dtransform abs exch abs .max /.show.scale exch def
%   0.1 dup 3 -1 roll scale
  gsave initmatrix
		% Assume the original transformation is well-behaved...
  0.1 0 dtransform abs exch abs .max
  0.1 dup scale .show.ident.matrix currentmatrix
		% ... but undo any rotation into landscape orientation.
  dup 0 get 0 eq {
    1 get dup abs div 90 mul rotate
    .show.ident.matrix currentmatrix
  } if
  grestore
} bind def

/.coord {		% <x> <y> .coord <x'> <y'>
  transform .show.ident exch pop itransform
  exch round cvi exch round cvi
} odef

/.dcoord {		% <dx> <dy> .coord <dx'> <dy'>
		% Transforming distances is trickier, because
		% the coordinate system might be rotated.
   .show.ident pop 3 1 roll
   exch 0 dtransform
    dup mul exch dup mul add sqrt
     2 index div round cvi
   exch 0 exch dtransform
    dup mul exch dup mul add sqrt
     3 -1 roll div round cvi
} odef

% Remember the current X, Y, and height.
/.show.x .inew def
/.show.y .inew def
/.show.height .inew def

% Remember the last character of the previous string; if it was a
% hyphen preceded by a letter, we didn't output the hyphen.

/.show.last (\000) def

% Remember the current font.
/.font.name 130 string def
/.font.name.length .inew def
/.font.height .inew def
/.font.width .inew def

%%* Also remember indentation of current line and previous vertical
%%* skip

/.show.indent .inew def
/.show.dy     .inew def

% We have to redirect stdout somehow....

/.show.stdout { (%stdout) (w) file } bind def

% Make sure writing will work even if a program uses =string.
/.show.string =string length string def
/.show.=string =string length string def
/.show==only
 { //=string //.show.=string copy pop
   dup type /stringtype eq
    { dup length //.show.string length le
       { dup rcheck { //.show.string copy } if
       } if
    } if
   .show.stdout exch write==only
   //.show.=string //=string copy pop
 } odef
/.show==4
 { 4 -1 roll .show==only ( ) //print
   3 -1 roll .show==only ( ) //print
   exch .show==only ( ) //print
   .show==only (\n) //print
 } odef

/.showwidth	% Same as stringwidth, but disable COMPLEX so that
		% we don't try to detect rectangles during BuildChar.
 { COMPLEX
    { /COMPLEX false def stringwidth /COMPLEX true def }
    { stringwidth }
   ifelse
 } odef

/.showfont	% <string> .showfont <string>
 { gsave
	% Try getting the height and width of the font from the FontBBox.
     currentfont /FontBBox .knownget not { {0 0 0 0} } if
     aload pop      % llx lly urx ury
     exch 4 -1 roll % lly ury urx llx
     sub            % lly ury dx
     3 1 roll exch  % dx ury lly
     sub            % dx dy
     2 copy .max 0 ne
      { currentfont /FontMatrix get dtransform
      }
      {	pop pop
	% Fonts produced by dvips, among other applications, have
	% BuildChar procedures that bomb out when given unexpected
	% characters, and there is no way to determine whether a given
	% character will do this.  So for Type 1 fonts, we measure a
	% typical character ('X'); for others, we punt.
	currentfont /FontType get 1 eq
	 { (X) .showwidth pop dup 1.3 mul
	 }
	 {	% No safe way to get the character size.  Punt.
	   0 0
	 }
	ifelse
      }
     ifelse .dcoord exch
     currentfont /FontName .knownget not { () } if
     dup type /stringtype ne { //.show.string cvs } if
   grestore
	% Stack: height width fontname
   SIMPLE
    { pop pop //.show.height exch .iput }
    { 2 index //.font.height .iget eq
      2 index //.font.width .iget eq and
      1 index //.font.name 0 //.font.name.length .iget getinterval eq and
       { pop pop pop
       }
       { (F ) //print
	 3 -1 roll dup //.font.height exch .iput .show==only ( ) //print
         exch dup //.font.width exch .iput .show==only ( ) //print
	 dup length //.font.name.length exch .iput
         //.font.name cvs .show==only (\n) //print
       }
      ifelse
    }
   ifelse
 } odef

% Define the letters -- characters which, if they occur followed by a hyphen
% at the end of a line, cause the hyphen and line break to be ignored.
/.letter.chars 100 dict def
mark
  65 1 90 { dup 32 add } for
    counttomark
        { StandardEncoding exch get .letter.chars exch dup put }
    repeat
pop

%%* Add the rest of the letters from the [O]T1Encoding and
%%* ISOLatin1Encoding vectors

mark
    /AE
    /Aacute
    /Abreve
    /Acircumflex
    /Adieresis
    /Agrave
    /Aogonek
    /Aring
    /Atilde
    /Cacute
    /Ccaron
    /Ccedilla
    /Dcaron
    /Eacute
    /Ecaron
    /Ecircumflex
    /Edieresis
    /Egrave
    /Eng
    /Eogonek
    /Eth
    /Gbreve
    /Germandbls 
    /IJ
    /Iacute
    /Icircumflex
    /Idieresis
    /Idot
    /Igrave
    /Lacute
    /Lcaron
    /Lslash
    /Nacute
    /Ncaron
    /Ntilde
    /OE
    /Oacute
    /Ocircumflex
    /Odieresis
    /Ograve
    /Ohungarumlaut
    /Oslash
    /Otilde
    /Racute
    /Rcaron
    /Sacute
    /Scaron
    /Scedilla
    /Tcaron
    /Tcedilla
    /Thorn
    /Uacute
    /Ucircumflex
    /Udieresis
    /Ugrave
    /Uhungarumlaut
    /Uring
    /Yacute
    /Ydieresis
    /Zacute
    /Zcaron
    /Zdot
    /aacute
    /abreve
    /acircumflex
    /adieresis
    /ae
    /agrave
    /aogonek
    /aring
    /atilde
    /cacute
    /ccaron
    /ccedilla
    /dbar
    /dcaron
    /dotlessi
    /dotlessj
    /eacute
    /ecaron
    /ecircumflex
    /edieresis
    /egrave
    /eng
    /eogonek
    /eth
    /exclamdown
    /ff
    /ffi
    /ffl
    /fi
    /fl
    /gbreve
    /germandbls
    /iacute
    /icircumflex
    /idieresis
    /igrave
    /ij
    /lacute
    /lcaron
    /lslash
    /nacute
    /ncaron
    /ntilde
    /oacute
    /ocircumflex
    /odieresis
    /oe
    /ograve
    /ohungarumlaut
    /oslash
    /otilde
    /questiondown
    /racute
    /rcaron
    /sacute
    /scaron
    /scedilla
    /section
    /sterling
    /tcaron
    /tcedilla
    /thorn
    /uacute
    /ucircumflex
    /udieresis
    /ugrave
    /uhungarumlaut
    /uring
    /yacute
    /ydieresis
    /zacute
    /zcaron
    /zdot
counttomark
    { .letter.chars exch dup put }
repeat
pop

% Define a set of characters which, if they occur at the start of a line,
% are taken as indicating a paragraph break.
/.break.chars 50 dict def
mark
    /bullet /dagger /daggerdbl /periodcentered /section
    counttomark
        { .break.chars exch dup put }
    repeat
pop

% Define character translation to ASCII.
% We have to do this for the entire character set.

/.char.map 500 dict def

/.chars.def { counttomark 2 idiv { .char.map 3 1 roll put } repeat pop } def

% Encode the printable ASCII characters.

mark 32 1 126
 { 1 string dup 0 4 -1 roll put
   dup 0 get StandardEncoding exch get exch
 }
for .chars.def

        % Encode accents.
mark
    /acute      (')
    /caron      (^)
    /cedilla    (,)
    /circumflex (^)
    /dieresis   (")
    /grave      (`)
    /ring       (*)
    /tilde      (~)
.chars.def

        % Encode the ISO accented characters.
mark 192 1 255
 { ISOLatin1Encoding exch get =string cvs
   dup 0 1 getinterval 1 index dup length 1 sub 1 exch getinterval
   .char.map 2 index known .char.map 2 index known and
    { .char.map 3 -1 roll get .char.map 3 -1 roll get concatstrings
      .char.map 3 1 roll put
    }
    { pop pop pop
    }
   ifelse
 }
for .chars.def

% Encode the remaining standard and ISO alphabetic characters.

mark
  /AE (AE) /Eth (DH) /OE (OE) /Thorn (Th)
  /ae (ae) /eth (dh)
  /ffi (ffi) /ffl (ffl) /fi (fi) /fl (fl)
  /germandbls (ss) /oe (oe) /thorn (th)
.chars.def

% Encode the other standard and ISO characters.

mark
  /brokenbar (|) /bullet (*) /copyright ((C)) /currency (#)
  /dagger (#) /daggerdbl (##) /degree (o) /divide (/) /dotaccent (.)
  /dotlessi (i)
  /ellipsis (...) /emdash (--) /endash (-) /exclamdown (!)
  /florin (f) /fraction (/)
  /guillemotleft (<<) /guillemotright (>>)
  /guilsinglleft (<) /guilsinglright (>) /hungarumlaut ("") /logicalnot (~)
  /macron (_) /minus (-) /mu (u) /multiply (*)
  /ogonek (,) /onehalf (1/2) /onequarter (1/4) /onesuperior (1)
  /ordfeminine (-a) /ordmasculine (-o)
  /paragraph (||) /periodcentered (*) /perthousand (o/oo) /plusminus (+-)
  /questiondown (?) /quotedblbase (") /quotedblleft (") /quotedblright (")
  /quotesinglbase (,) /quotesingle (') /registered ((R))
  /section ($) /sterling (#)
  /threequarters (3/4) /threesuperior (3) /trademark ((TM)) /twosuperior (2)
  /yen (Y)
.chars.def

% Encode a few common Symbol characters.

mark
  /asteriskmath (*) /copyrightsans ((C)) /copyrightserif ((C))
  /greaterequal (>=) /lessequal (<=) /registersans ((R)) /registerserif ((R))
  /trademarksans ((TM)) /trademarkserif ((TM))
.chars.def

%%* Add a few characters from StandardEncoding and ISOLatin1Encoding
%%* that were missing.

mark
    /cent           (c)
    /guilsinglleft  (<)
    /guilsinglright (>)
    /breve          (*)
    /Lslash         (L/)
    /lslash         (l/)
.chars.def

%%* Define the OT1Encoding and T1Encoding vectors for use with dvips
%%* files.  Unfortunately, there's no way of telling what font is
%%* really being used within a dvips document, so we can't provide an
%%* appropriate encoding for each individual font.  Instead, we'll
%%* just provide support for the two most popular text encodings, the
%%* OT1 and T1 encodings, and just accept the fact that any font not
%%* using one of those encodings will be rendered as gibberish.
%%* 
%%* OT1 is Knuth's 7-bit encoding for the CMR text fonts, while T1
%%* (aka the Cork encoding) is the 8-bit encoding used by the DC
%%* fonts, a preliminary version of the proposed Extended Computer
%%* Modern fonts.  Unfortunately, T1 is not a strict extension of OT1;
%%* they differ in positions 8#000 through 8#040, 8#074, 8#076, 8#134,
%%* 8#137, 8#173, 8#174, 8#175 and 8#177, so we can't use the same
%%* vector for both.
%%* 
%%* Of course, we also can't reliably tell the difference between an
%%* OT1-encoded font and a T1-encoded font based on the information in
%%* a dvips-created PostScript file.  As a best-guess solution, we'll
%%* use the T1 encoding if the font contains any characters in
%%* positions above 8#177 and the OT1 encoding if it doesn't.

/T1Encoding  256 array def

/OT1Encoding 256 array def

%%* T1Encoding shares a lot with StandardEncoding, so let's start
%%* there.

StandardEncoding T1Encoding copy pop

/OT1.encode {
    counttomark
    2 idiv
      { OT1Encoding 3 1 roll put }
    repeat
    cleartomark
} def

/T1.encode {
    counttomark
    2 idiv
      { T1Encoding 3 1 roll put }
    repeat
    cleartomark
} def

mark
    8#000 /grave
    8#001 /acute
    8#002 /circumflex
    8#003 /tilde
    8#004 /dieresis
    8#005 /hungarumlaut
    8#006 /ring
    8#007 /caron

    8#010 /breve
    8#011 /macron
    8#012 /dotaccent
    8#013 /cedilla
    8#014 /ogonek
    8#015 /quotesinglbase
    8#016 /guilsinglleft
    8#017 /guilsinglright

    8#020 /quotedblleft
    8#021 /quotedblright
    8#022 /quotedblbase
    8#023 /guillemotleft
    8#024 /guillemotright
    8#025 /endash
    8#026 /emdash
    8#027 /cwm

    8#030 /perthousandzero
    8#031 /dotlessi
    8#032 /dotlessj
    8#033 /ff
    8#034 /fi
    8#035 /fl
    8#036 /ffi
    8#037 /ffl

%%  8#040 through 8#176 follow StandardEncoding

    8#177 /hyphen
T1.encode

mark
    8#200 /Abreve
    8#201 /Aogonek
    8#202 /Cacute
    8#203 /Ccaron
    8#204 /Dcaron
    8#205 /Ecaron
    8#206 /Eogonek
    8#207 /Gbreve
    8#210 /Lacute
    8#211 /Lcaron
    8#212 /Lslash
    8#213 /Nacute
    8#214 /Ncaron
    8#215 /Eng
    8#216 /Ohungarumlaut
    8#217 /Racute
    8#220 /Rcaron
    8#221 /Sacute
    8#222 /Scaron
    8#223 /Scedilla
    8#224 /Tcaron
    8#225 /Tcedilla
    8#226 /Uhungarumlaut
    8#227 /Uring
    8#230 /Ydieresis
    8#231 /Zacute
    8#232 /Zcaron
    8#233 /Zdot
    8#234 /IJ
    8#235 /Idot
    8#236 /dbar
    8#237 /section
    8#240 /abreve
    8#241 /aogonek
    8#242 /cacute
    8#243 /ccaron
    8#244 /dcaron
    8#245 /ecaron
    8#246 /eogonek
    8#247 /gbreve
    8#250 /lacute
    8#251 /lcaron
    8#252 /lslash
    8#253 /nacute
    8#254 /ncaron
    8#255 /eng
    8#256 /ohungarumlaut
    8#257 /racute
    8#260 /rcaron
    8#261 /sacute
    8#262 /scaron
    8#263 /scedilla
    8#264 /tcaron
    8#265 /tcedilla
    8#266 /uhungarumlaut
    8#267 /uring
    8#270 /ydieresis
    8#271 /zacute
    8#272 /zcaron
    8#273 /zdot
    8#274 /ij
    8#275 /exclamdown
    8#276 /questiondown
    8#277 /sterling

    8#300 /Agrave
    8#301 /Aacute
    8#302 /Acircumflex
    8#303 /Atilde
    8#304 /Adieresis
    8#305 /Aring
    8#306 /AE
    8#307 /Ccedilla
    8#310 /Egrave
    8#311 /Eacute
    8#312 /Ecircumflex
    8#313 /Edieresis
    8#314 /Igrave
    8#315 /Iacute
    8#316 /Icircumflex
    8#317 /Idieresis
    8#320 /Eth
    8#321 /Ntilde
    8#322 /Ograve
    8#323 /Oacute
    8#324 /Ocircumflex
    8#325 /Otilde
    8#326 /Odieresis
    8#327 /OE
    8#330 /Oslash
    8#331 /Ugrave
    8#332 /Uacute
    8#333 /Ucircumflex
    8#334 /Udieresis
    8#335 /Yacute
    8#336 /Thorn
    8#337 /Germandbls 

    8#340 /agrave
    8#341 /aacute
    8#342 /acircumflex
    8#343 /atilde
    8#344 /adieresis
    8#345 /aring
    8#346 /ae
    8#347 /ccedilla
    8#350 /egrave
    8#351 /eacute
    8#352 /ecircumflex
    8#353 /edieresis
    8#354 /igrave
    8#355 /iacute
    8#356 /icircumflex
    8#357 /idieresis
    8#360 /eth
    8#361 /ntilde
    8#362 /ograve
    8#363 /oacute
    8#364 /ocircumflex
    8#365 /otilde
    8#366 /odieresis
    8#367 /oe
    8#370 /oslash
    8#371 /ugrave
    8#372 /uacute
    8#373 /ucircumflex
    8#374 /udieresis
    8#375 /yacute
    8#376 /thorn
    8#377 /germandbls

T1.encode

%%* Now copy OT1Encoding into T1Encoding and make a few changes.

T1Encoding OT1Encoding copy pop

mark
    8#000 /Gamma
    8#001 /Delta
    8#002 /Theta
    8#003 /Lambda
    8#004 /Xi
    8#005 /Pi
    8#006 /Sigma
    8#007 /Upsilon

    8#010 /Phi
    8#011 /Psi
    8#012 /Omega
    8#013 /ff
    8#014 /fi
    8#015 /fl
    8#016 /ffi
    8#017 /ffl

    8#020 /dotlessi
    8#021 /dotlessj
    8#022 /grave
    8#023 /acute
    8#024 /caron
    8#025 /breve
    8#026 /macron
    8#027 /ring

    8#030 /cedilla
    8#031 /germandbls
    8#032 /ae
    8#033 /oe
    8#034 /oslash
    8#035 /AE
    8#036 /OE
    8#037 /Oslash

    8#040 /polishslash

    8#042 /quotedblright

    8#074 /exclamdown
    8#076 /questiondown

    8#134 /quotedblleft
    8#137 /dotaccent

    8#173 /endash
    8#174 /emdash
    8#175 /hungarumlaut
    8#177 /dieresis
OT1.encode

%%* And add a few characters from the OT1Encoding

mark
    /Gamma              (\\Gamma )
    /Delta              (\\Delta )
    /Theta              (\\Theta )
    /Lambda             (\\Lambda )
    /Xi                 (\\Xi )
    /Pi                 (\\Pi )
    /Sigma              (\\Sigma )
    /Upsilon            (\\Upsilon )

    /Phi                (\\Phi )
    /Psi                (\\Psi )
    /Omega              (\\Omega )

    /dotlessj           (j)
    /ff                 (ff)

    /cwm                ()

    /perthousandzero    (0)

    /polishslash        ()

    /Abreve             (A*)
    /Aogonek            (A,)
    /Cacute             (C')
    /Ccaron             (C^)
    /Dcaron             (D^)
    /Ecaron             (E^)
    /Eogonek            (E,)
    /Gbreve             (G*)
    /Lacute             (L')
    /Lcaron             (L^)
    /Nacute             (N')
    /Ncaron             (N^)
    /Eng                (NG)
    /Ohungarumlaut      (O"")
    /Racute             (R')
    /Rcaron             (R^)
    /Sacute             (S')
    /Scaron             (S^)
    /Scedilla           (S,)
    /Tcaron             (T^)
    /Tcedilla           (T,)
    /Uhungarumlaut      (U"")
    /Uring              (U*)
    /Ydieresis          (Y")
    /Zacute             (Z')
    /Zcaron             (Z^)
    /Zdot               (Z.)
    /IJ                 (IJ)
    /Idot               (I.)
    /dbar               (d-)
    /abreve             (a*)
    /aogonek            (a,)
    /cacute             (c')
    /ccaron             (c^)
    /dcaron             (d^)
    /ecaron             (e^)
    /eogonek            (e,)
    /gbreve             (g*)
    /lacute             (l')
    /lcaron             (l^)
    /nacute             (n')
    /ncaron             (n^)
    /eng                (ng)
    /ohungarumlaut      (o"")
    /racute             (r')
    /rcaron             (r^)
    /sacute             (s')
    /scaron             (s^)
    /scedilla           (s,)
    /tcaron             (t^)
    /tcedilla           (t,)
    /uhungarumlaut      (u"")
    /uring              (u*)
    /zacute             (z')
    /zcaron             (z^)
    /zdot               (z.)
    /ij                 (ij)
    /Germandbls         (SS)
.chars.def

%%* We extend the df-tail command to stick in an Encoding vector (see
%%* above for a discussion of the T1 and OT1 encodings), put in a
%%* FontName (which will just be dvips's name for the font, i.e., Fa,
%%* Fb, etc.) and give each font a separate FontBBox instead of
%%* letting them all share a single one.

/dvips.df-tail      % id numcc maxcc df-tail
  {
    /nn 9 dict N
    nn begin
        %%  
        %%  Choose an encoding based on the highest position occupied.
        %%  
        dup 128 gt { T1Encoding } { OT1Encoding } ifelse
        /Encoding X
        /FontType 3 N
        %%
        %%  It's ok for all the fonts to share a FontMatrix, but they
        %%  need to have separate FontBBoxes
        %%
	/FontMatrix fntrx N
	/FontBBox [0 0 0 0] N
        string /base X
        array /BitMaps X
        %%
        %%  And let's throw in a FontName for good measure
        %%
        dup (    ) cvs
        %%  
        %%  Make sure each font gets it own private FontName.  -- dmj,
        %%  12/23/97
        %%  
        dup length string copy
        /FontName X
        /BuildChar {CharBuilder} N
    end
    dup { /foo setfont }
       2 array copy cvx N
    load
       0 nn put
    /ctr 0 N
    [
} def

%%* This is functionally equivalent to dvips's /D procedure, but it
%%* also calculates the Font Bounding Box while defining the
%%* characters.

/dvips.D   % char-data ch D - : define character bitmap in current font
{
    /cc X                           % char-data
    dup type /stringtype ne {]} if  % char-data

    /ch-data X
    nn /base get cc ctr put     % (adds ctr to cc'th position of BASE)
    nn /BitMaps get
    ctr
    ch-data                     % BitMaps ctr char-data
    sf 1 ne {
       dup dup length 1 sub dup 2 index S get sf div put
    } if
    put                         % puts char-data into BitMaps at index ctr
    /ctr ctr 1 add N
%%  
%%  Make sure the Font Bounding Box encloses the Bounding Box of the
%%  current character
%%
    nn /FontBBox get        % BB

    dup                     % calculate new llx
    dup 0 get
    ch-xoff
    .min
    0 exch put

    dup                     % calculate new lly
    dup 1 get
    ch-yoff ch-height sub
    .min
    1 exch put

    dup                     % calculate new urx
    dup 2 get
    ch-dx ch-width add
    .max 
    2 exch put

    dup 3 get               % calculate new ury
    ch-yoff
    .max 
    3 exch put

} def

%%* Define start-hook to replace df-tail and D by our versions.
%%* Unfortunately, the user can redefine start-hook and thus bypass
%%* these changes, but I don't see an obvious way around that.

userdict /start-hook {
    TeXDict /df-tail /dvips.df-tail load bind put
    TeXDict /D       /dvips.D       load bind put
} put

%%* Introduce a symbolic constant for hyphens.  (Need to make
%%* allowance for hyphen being in different place?)

/.hyphen 45 def

% Write out a string.  If it ends in a letter and a hyphen,
% don't write the hyphen, and set .show.last to a hyphen;
% otherwise, set .show.last to the character (or \000 if it was a hyphen).
/.show.write    % <string>
 {
    dup length 1 ge
        { dup dup length 1 sub get      % string last_char
          dup .hyphen eq                % string last_char hyphen?
            {                           % string last_char
                1 index length 1 gt
                    { 1 index dup length 2 sub get }
                    { //.show.last 0 get }
                ifelse                  % string last_char prev-char
                currentfont /Encoding get exch get  % look up prev-char
                //.letter.chars exch known          % is it a letter?
                    { % Remove the hyphen           % string last_char
                        exch                        % last_char string
                        dup length 1 sub            % last_char string len-1
                        0 exch getinterval          % last_char string-1
                        exch                        % string-1 last_char
                    }
                    { pop 0 }                       % string 0
                ifelse
            }
          if
          //.show.last 0 3 -1 roll put              % store last_char
                                                    % in .show.last
                                                    % If .show.last ==
                                                    % hyphen, then
                                                    % last char of
                                                    % previous string
                                                    % was a hyphen
        }
    if                                          % string
    { % begin forall                            % c
        dup                                     % c c
        currentfont /Encoding get               % c c vec
        exch get                                % c name
        dup //.char.map exch known              % c name bool
          { exch pop }
          { pop OT1Encoding exch get }
        ifelse                                  % name
        //.char.map exch get                    % translation
        .show.stdout exch writestring
    }
    forall
} odef

/.showstring1 {                 % string
    currentpoint .coord         % string x y
    3 -1 roll dup .showwidth    % x y string dx dy
    1 index                     % x y string dx dy dx
    0 rmoveto                   % x y string dx dy
    .dcoord pop                 % x y string width
    SIMPLE
      {                         % x y string width
        2 index                 % x y string width y
        //.show.y .iget         % x y string width y old.y
        %%* 
        %%* Replaced test "has y changed" by "has y changed by more
        %%* than the current font height" so that subscripts and
        %%* superscripts won't cause line/paragraph breaks
        %%* 
         sub abs dup            % x y string width dy dy
         //.show.height .iget
         gt
         {                      % x y string width dy

            %%* Vertical position has changed by more than the font
            %%* height, so we now try to figure out whether we've
            %%* started a new paragraph or merely a new line, using a
            %%* variety of heuristics.

            %%* If any of the following is true, we start a new
            %%* paragraph:

            %%* (a) the current vertical shift is more than 1.1 times
            %%*     the previous vertical shift, where 1.1 is an
            %%*     arbitrarily chosen factor that could probably be
            %%*     refined.

            dup                 % x y string width dy dy
            //.show.dy .iget 1.1 mul
            gt
            exch

            %%* Save the new vertical shift

            //.show.dy exch .iput

            %%* (b) The vertical shift is more than 1.3 times the
            %%*     "size" of the current font.  I've removed this
            %%*     test since it's not really very useful.

%%*            //.show.dy .iget
%%*            //.show.height .iget 1.4 mul
%%*            gt                          % x y string width bool
%%*            .show.height .iget 0 gt and % only perform test if font
%%*                                        % height is nonzero
%%*            or

            %%* (c) the first character of the new line is one of the
            %%*     .break.chars

            2 index length      % x y string width newpar? len
            0 gt                % x y string width newpar? len>0?
              {
                2 index 0 get   % x y string width newpar? s
                currentfont /Encoding get
                exch get        % x y string width newpar? s_enc
                //.break.chars exch known { pop true } if
              }
            if                  % x y string width newpar?

            %%* (d) The indentation of the new line is greater than
            %%*     the indentation of the previous line.

            4 index
            //.show.indent .iget
            gt
            or

            %%* HOWEVER, if the line ends in a hyphen, we do NOT begin
            %%* a new paragraph (cf. comment at end of BF2).  --dmj,
            %%* 12/23/97

            //.show.last 0 get .hyphen ne
            and

            % newpar?
              { (\n\n) }        % Paragraph
              {                 % Line
                                %%* 
                                %%* BF2: If last character on a line is
                                %%* a hyphen, we omit the hyphen and
                                %%* run the lines together.  Of
                                %%* course, this will fail if a word
                                %%* with an explicit hyphen (e.g.,
                                %%* X-ray) is split across two lines.
                                %%* Oh, well.  (What should we do
                                %%* about a hyphen that ends a
                                %%* "paragraph"?  Perhaps that should
                                %%* inhibit a paragraph break.)
                                %%*
                //.show.last 0 get .hyphen eq
                    { ()  }
                    { ( ) }
                ifelse          % x y string width char
              }
            ifelse
            //print

            //.show.y 3 index .iput % x y string width
            //.show.x 4 index .iput % x y string width
            //.show.indent 4 index .iput
         }
         {                      % x y string width dy
                  % If the word processor split a hyphenated word within
                  % the same line, put out the hyphen now.
            pop
            //.show.last 0 get .hyphen eq { (-) //print } if
         }
        ifelse
                                %%* 
                                %%* If have moved more than 1 point to
                                %%* the right, interpret it as a
                                %%* space?  This need to be looked at
                                %%* more closely.
                                %%* 
        3 index                     % x y string width x
        //.show.x .iget 10 add gt   % x y string width bool
            { ( ) //print }
        if
                                    % x y string width
        4 1 roll                    % width x y string
        .show.write pop             % width x
        add //.show.x exch .iput    % <empty>
      }
      { (S ) //print .show==4 }
    ifelse
} odef

/.showstring
 { dup () eq { pop } { .showstring1 } ifelse
 } bind def

% Redefine all the string display operators.

/show {
    .showfont
    .showcolor
    .showstring
} codef

% We define all the other operators in terms of .show1.

/.show1.string ( ) def
/.show1 { //.show1.string exch 0 exch put //.show1.string .showstring } odef
/ashow
 { .showfont .showcolor
   { .show1 2 copy rmoveto } forall
   pop pop
 } codef
/awidthshow
 { .showfont .showcolor
    { dup .show1 4 index eq { 4 index 4 index rmoveto } if
      2 copy rmoveto
    }
   forall
   pop pop pop pop pop
 } codef
/widthshow
 { .showfont .showcolor
   //.show1.string 0 4 -1 roll put
    { //.show1.string search not { exit } if
      .showstring .showstring
      2 index 2 index rmoveto
    } loop
   .showstring pop pop
 } codef
/kshow
 { .showfont .showcolor
	%**************** Should construct a closure, in case the procedure
	%**************** affects the o-stack.
    { .show1 dup exec } forall pop
 } codef

% We don't really do the right thing with the Level 2 show operators,
% but we do something semi-reasonable.
/xshow { pop show } codef
/yshow { pop show } codef
/xyshow { pop show } codef
/glyphshow
 { currentfont /Encoding .knownget not { {} } if
   0 1 2 index length 1 sub
    {		% Stack: glyph encoding index
      2 copy get 3 index eq { exch pop exch pop null exit } if
      pop
    }
   for null eq { (X) dup 0 4 -1 roll put show } { pop } ifelse
 } codef

end

% Bind the operators we just defined, and all the others if we didn't
% do it before.  Also reenable 'bind' for future files.

.bindoperators
NOBIND currentdict systemdict ne and
 { systemdict begin .bindoperators end }
if
NOBIND
 { /bind /.bind load def }
if

% Make systemdict read-only if it wasn't already.

systemdict wcheck { systemdict readonly pop } if

% Restore the current local/global VM mode.

exec


                                 !2!!!!!!!!!!#                      H   H                                                          a a a      z z z                  #"#B#B#B#B#B#B#B#B#B#B"B                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  %    Copyright (C) 1990-2002 artofcode LLC. All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: ps2epsi.ps,v 1.5.2.3 2002/04/22 20:30:39 giles Exp $
% Convert an arbitrary PostScript file to an EPSI file.
%
% Please do not contact these users if you have questions.  They no longer
% have the time, interest, or current expertise to keep this code working.
% If you find bugs, please send proposed fixes to bug-gs@aladdin.com.
%
% Bug fix 2002-04-20 by rayjj: Bounding box was incorrect since it depended
%   on the dither pattern and gray shade at the boundary. Changed to use
%   8-bit grayscale preview image to allow correct bounding box (at the
%   expense of a 8x larger preview image). Also moved .setsafe until after
%   the device and file operations are complete (but still before the input
%   file is processed.
% Bug fix 2000-04-11 by lpd: if a font didn't have a FontName (which is the
%   case for bitmap fonts produced by recent versions of dvips), setfont
%   caused an error.
% Bug fix 8/21/99 by lpd: many of the margin and width computations were
%   wrong (off by 1).  The code only "worked" because the bugs were
%   (mostly) in conservative directions.
% Modified 3/17/98 by lpd to make it possible to run this file without
%   running the ps2epsi script first, for debugging.
% Bug fix 9/29/97 by lpd <ghost@aladdin.com>: if the page size wasn't an
%   exact multiple of 8 bits, an incorrect bounding box (or a rangecheck
%   error) could occur.
% Patched 7/26/95 by
%	Greg P. Kochanski <gpk@bell-labs.com>
%   to add many new DSC comments and make the comments conforming.
% Original version contributed by
%	George Cameron <george@bio-medical-physics.aberdeen.ac.uk>
%

% Initialize, and redefine copypage and showpage.

% ps2edict is normally defined in the pre-loaded code created by the
% ps2epsi script.
/ps2edict where { pop } { /ps2edict 25 dict def } ifelse
ps2edict begin

				% The main procedure
  /ps2epsi
   {				% Open the file
     outfile (w) file /epsifile exch def
					% Get the device parameters
     currentdevice getdeviceprops .dicttomark 
     /HWSize get aload pop
       /devheight exch def
       /devwidth exch def
     matrix defaultmatrix
       /devmatrix exch def
				% Make a corresponding 8-bit deep memory device
     devmatrix devwidth devheight
     256 string 0 1 255 { 1 index exch dup 255 exch sub put } for
     makeimagedevice
     /arraydevice exch def
     arraydevice
     % Turn on anti-aliasing
     mark /TextAlphaBits 4 /GraphicsAlphaBits 4 6 -1 roll
     putdeviceprops
     setdevice	% (does an erasepage)
     /rowwidth devwidth def
     /row rowwidth string def
     /zerorow rowwidth string def	% all zero
				% Replace the definition of showpage
     userdict /showpage { ps2edict begin epsipage end } bind put
     userdict /setfont { ps2edict begin epsisetfont end } bind put
     //systemdict /.setsafe known { .setsafe } if
   } bind def

 /epsifontdict 100 dict def

 /epsisetfont
 {
 % code here keeps a list of font names in dictionary epsifontdict
 /tmpfont exch def
 tmpfont /FontName known {
   /tmpfontname tmpfont /FontName get def
   epsifontdict tmpfontname known not { epsifontdict tmpfontname 0 put } if
   epsifontdict tmpfontname 2 copy get 1 add put
 } if
 tmpfont setfont
 } bind def

% Get a scan line from the memory device, zeroing any bits beyond
% the device width.
/getscanline {		% <device> <y> <string> getscanline <string>
  dup 4 1 roll copyscanlines pop
  16#ff00 devwidth 7 and neg bitshift 255 and
  dup 0 ne {
    1 index dup length 1 sub 2 copy get 4 -1 roll and put
  } {
    pop
  } ifelse
} bind def

/margintest {		% <y-start> <step> <y-limit> margintest <y-non-blank>
			% <y-start> <step> <y-limit> margintest -
  { dup arraydevice exch row getscanline
    zerorow ne { exit } if pop
  } for
} bind def


  /epsiNameStr 200 string def
  /epsiNpages 0 def
  /epsiNpageStr 20 string def
  /epsipage
   {      
     /epsiNpages epsiNpages 1 add def
     /loopcount devheight 1 sub def

     % Find top margin -- minimum Y of non-blank scan line.
     -1 0 1 loopcount margintest
     dup -1 eq { (blank page!!\n) print quit }{ exch pop } ifelse 
     /tm exch def

     % Find bottom margin -- maximum Y of non-blank scan line.
     loopcount -1 0 margintest
     /bm exch def
     
     % Initialise limit variables
     /loopcount rowwidth 1 sub def
     /lm loopcount def 
     /rm 0 def 

     % Find left and right boundaries of image
     tm 1 bm
      { % Get more data
	arraydevice exch row getscanline pop
	% Scan from left to find first non-zero element
	% We save first the element, then the index
	-1 0 1 loopcount
	{ dup row exch get 0 ne { exch pop exit }{ pop } ifelse
	} for
	% If we found -1, row is blank ..
	dup -1 ne 
	{ % Find the leftmost index
          dup lm lt
          % If the new index is less, we save index and element
          { /lm exch def } { pop } ifelse
	  % Now find the rightmost index
	  loopcount -1 0
          { dup row exch get 0 ne { exit }{ pop } ifelse
          } for
	  dup rm gt
          % If the new index is greater, we save index and element
          { /rm exch def } { pop } ifelse
	} if
      } for

     % Calculate the bounding box values.
     % Note that these must be corrected to produce closed-open intervals.
     /llx lm def
     /lly devheight bm sub 1 sub def
     /urx rm 1 add def
     /ury devheight tm sub def

    % Write out the magic string and bounding box information
     epsifile (%!PS-Adobe-2.0 EPSF-1.2\n) writestring
	 /epsititle where { pop epsifile epsititle writestring } if
	 /epsicreator where { pop epsifile epsicreator writestring } if
	 /epsicrdt where { pop epsifile epsicrdt writestring } if
	 /epsifor where { pop epsifile epsifor writestring } if
     epsifile flushfile

	% Write out the page count:
	 epsifile (%%Pages: ) writestring
	 epsifile epsiNpages epsiNpageStr cvs writestring
	 epsifile (\n) writestring
     epsifile flushfile

	% Write out the list of used fonts:
	 epsifile (%%DocumentFonts:) writestring
	 epsifontdict {
					epsifile ( ) writestring
					pop epsiNameStr cvs epsifile exch writestring
					} forall
	 epsifile (\n) writestring
     epsifile flushfile

     epsifile (%%BoundingBox: ) writestring
     epsifile llx write==only epsifile ( ) writestring
     epsifile lly write==only epsifile ( ) writestring
     epsifile urx write==only epsifile ( ) writestring
     epsifile ury write==

    % Define character and bit widths for the output line buffer:
     /cwidth rm lm sub 1 add def
     /out cwidth string def

     epsifile (%%BeginPreview: ) writestring
     epsifile cwidth write==only epsifile ( ) writestring
     epsifile bm tm sub 1 add write==only epsifile ( 8 ) writestring
     epsifile bm tm sub 1 add
     cwidth 39 add 40 idiv mul write==
     epsifile flushfile

     gsave

     tm 1 bm
      { % Get a scan line interval from the array device
	arraydevice exch row copyscanlines lm cwidth getinterval
	% Write out the hex data as 40 bytes per line (82 chars)
	0 40 cwidth
	 { epsifile (% ) writestring 
	   epsifile exch 2 index exch
	   dup cwidth exch sub 40 .min getinterval writehexstring
	   epsifile (\n) writestring
	 } for
        pop
      } for

     epsifile (%%EndImage\n) writestring
     epsifile (%%EndPreview\n) writestring
     epsifile flushfile
     grestore
     erasepage initgraphics

     DonePage 0 1 put
   } bind def


(outfile) getenv
  { /outfile exch def 
    ps2epsi

    /DonePage 1 string def
    (%stdin) (r) file cvx execute0
    DonePage 0 get 0 eq { showpage } if
  } if

end
quit
 password protection     6 
 F Enquit
 	  Toggle status:      	  Program running:      	  
SAVR-Gestalt:      u                                    r         & 
 Y In some systems the gamma features are not properly initialized.
This fix will temporarily change the screendepth to 256 colors at startup.     	 .  ݈Advanced options    d (,         `    cdev      pref                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             %!
% Copyright (C) 1995, 1996 Aladdin Enterprises.  All rights reserved.

% $Id: rollconv.ps,v 1.1 2000/03/09 08:40:40 lpd Exp $
% Utility program for converting Japanese fonts produced by Macromedia's
% Rollup program to Type 0 fonts suitable for use with Ghostscript.
%
% Rollup produces the following files, where xxx is the font name:
%	xxx-H, xxx-SA, xxx-SB, xxx-SK, xxx-SR, xxx-UG
%	JIS83-1_COD
%	JIS83-1_CSA
% The _COD and _CSA files are large files containing the actual
% character outline data; they may theoretically be shared between
% multiple fonts.
%
% rollconv.ps converts the above to files named:
%	fff.ps
%	fff.COD
%	fff.CSA
%	fff.CSR
% where fff is a font file name provided by the user at conversion time.
% The fff.ps file is the actual font file to be loaded with `run'
% or placed in a Fontmap or a directory named by [GS_]FONTPATH;
% the other two files must be present at runtime in a directory that is
% on Ghostscript's search path (-I, GS_LIB, GS_LIB_DEFAULT).
%
% The normal way to invoke this program is
%	gsnd -- rollconv.ps xxx fff InDir CDir OutDir
% (assuming that gsnd is an alias for gs -dNODISPLAY), where:
%	xxx is the font name;
%	fff is the base part of the output file name;
%	InDir is the name of the directory containing the xxx-* input files;
%	CDir is the name of the directory containing the _COD and _CSA
%	  input files (typically the same as InDir);
%	OutDir is the name of the directory where the output should be written
%	  (OutDir must already exist).
% For example:
%	gsnd -- rollconv.ps HGGothicBPRO gothic /gs/k/rufonts/Gothic \
%	  /gs/k/rufonts/Gothic /gs/k/gsfonts
% To suppress output messages, you may insert -q:
%	gsnd -q -- rollconv.ps ...
%
% This program assumes that the files have been FTP'ed from a Macintosh and
% therefore have 128 bytes of garbage at the beginning.  If you have
% transferred them in some manner that avoids this, change true to false
% in the following line.
/fromMac true def
% The FontName of the converted font is xxx-83pv-RKSJ-H.  In order to
% use a converted font with Ghostscript, you may either load it explicitly
% at run time, e.g.,
%	(gothic.ps) run
% or you may add an entry to the Fontmap file, in the form:
%	/HGGothicBPRO-83pv-RKSJ-H  (gothic.ps)  ;
% which will allow the font to be loaded automatically.  After
% loading the font, by either method, you can select it in the usual way:
%	/HGGothicBPRO-83pv-RKSJ-H findfont 36 scalefont setfont
% or
%	/HGGothicBPRO-83pv-RKSJ-H 36 selectfont


/macrfile		% <filename> macrfile <file>
 { (r) file
   fromMac
    {		% Get rid of the initial Mac garbage (128 characters).
		% The garbage at the end is unpredictable,
		% so we'll just have to hope that it's all nulls.
      dup =string 0 128 getinterval readstring pop pop
    }
   if
 } bind def

/convert		% <FName> <OutBase> <InDir> <CDir> <OutDir> convert -
 { /OutDir exch def
   /CDir exch def
   /InDir exch def
   /OutBase exch def
   /FName exch def

   /inprefix InDir (/) concatstrings FName concatstrings (-) concatstrings def
   /inh inprefix (H) concatstrings def

		% Open the output file.

/OutDot OutDir (/) concatstrings OutBase concatstrings (.) concatstrings def
/outname OutDot (ps) concatstrings def
QUIET not { (Writing ) print outname = flush } if
/cdfromstr (\(pgfonts/) FName concatstrings (-JIS83-1_) concatstrings def
/cdstr (\() OutBase concatstrings (.) concatstrings def
/out outname (w) file def
/buffer 65000 string def

		% Copy the initial comments from the input file.

inh macrfile
 { dup =string readline pop
   out 1 index writestring out (\n) writestring
   (%%EndComments) eq { exit } if
 }
loop

		% Write out our preamble.

out (
currentpacking true setpacking
userdict /AltsysCFD3 known { (%END) .skipeof } if
userdict /AltsysCFD3 25 dict dup begin
/beint { 0 exch { exch 8 bitshift add } forall } bind def
/rfile { findlibfile { exch pop } { (r) file } ifelse } bind def
/str 500 string def
/AltRO { } def
/BuildCh		% <font> <ccode> <bias> BuildCh -
 { /bias exch def  /ccode exch def  begin % font
   ccode dup 255 and dup bias lt exch 252 gt or { pop 127 } if
   dup -8 bitshift -67 mul add % subfonts have 189 chars, not 256
   bias sub buildch1
 } bind def
/BuildChr		% <font> <ccode> BuildChr -
 { /ccode exch def  begin % font
   ccode buildch1
 } bind def
/buildch1
 { 6 mul PGOffsets add
   FileNames 0 get rfile dup dup 4 -1 roll setfileposition
   (xxxxxx) readstring pop exch closefile
   dup 1 3 getinterval beint % COD offset
   exch 4 2 getinterval beint % length
   dup 0 eq
    { pop pop currentdict end
      1000 0 0 0 1 1 0 -1000 500 1000 setcachedevice2
    }
    { dup str length gt { /str 1 index string store } if
      FileNames 1 get rfile dup dup % offset length file file file
      5 -1 roll setfileposition % length file file
      str 0 5 -1 roll getinterval readstring pop pop closefile
      currentdict end ccode str 1183615869 internaldict /CCRun get exec
    }
   ifelse
 } bind def
/privates 100 dict def
/BuildPr		% <stdhw> <stdvw> BuildPr <dict>
 { 2 copy 1000 mul add privates 1 index known
    { privates exch get 3 1 roll pop pop
    }
    { 7 dict begin
	/MinFeature{16 16}executeonly def
	/BlueValues BlueValues def
	/StdVW 3 -1 roll 1 array astore def
	/StdHW 3 -1 roll 1 array astore def
	/password 5839 def
	/LanguageGroup 1 def
	/Subrs Subrs def
      currentdict readonly end
      privates 2 index 2 index put exch pop
    }
   ifelse
 } bind def
/FullEncoding
  systemdict { pop } forall
  systemdict length 512 sub 1 255 { (x) dup 0 4 -1 roll put cvn } for
768 packedarray def
/BlueValues[-250 -250 1100 1100]readonly def
/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def
/CharStrings 1 dict
dup /.notdef (1py8) noaccess put
readonly def
/CDevProc
 { pop pop pop pop 0 exch -1000 exch 2 div currentfont /FontBBox get 3 get
 } bind def
/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]readonly def
/Subrs [
(1p|=-D\R) noaccess
(1pyUz) noaccess
(1pyĞi) noaccess
(1p) noaccess
(1p|35rI) noaccess
] noaccess def
end put
%END
) writestring

		% Locate and copy the definition of NotDefFont.

out (
FontDirectory /NotDefFont known { (%END) .skipeof } if
) writestring
 { dup =string readline pop
   dup (/NotDefFont) eq { exit } if pop
 }
loop out exch writestring out (\n) writestring
 { dup =string readline pop
   (definefont) search { pop pop pop exit } if
   out exch writestring out (\n) writestring
 }
loop out (definefont pop
%END
) writestring

		% Copy the definitions of the subfonts, moving the
		% CharStrings of the Roman supplement to an external file.
		% Stack for pattern procedures: infile line

/CSRName OutDot (CSR) concatstrings def
/csr CSRName (w) file def
QUIET not { (Writing ) print CSRName = flush } if

/encoding 256 array def

/patterns [
		% Patterns specific to the Roman supplement, in which
		% the outlines are in an eexec section.
 { (/Encoding 256 array) {
   pop out (/Encoding ) writestring
    { dup buffer readline pop
      dup (dup) search { exit } if pop pop
    }
   loop
    {	% Stack: infile dupline postdup (dup) predup
      pop pop exch pop
	% The top element of the stack is a string beginning with
	% an index and value to put into the Encoding.
      token pop exch token pop exch pop encoding 3 1 roll put
      dup buffer readline pop
      dup (dup) search not { pop exit } if
    }
   loop
   out encoding cvx write== out ( cvlit ) writestring
   out exch writestring out (\n) writestring
 } }
 { (/FontType 1 def) {
   pop out (/FontType 4 def\n) writestring
   out (/BuildChar{AltsysCFD3 begin BuildChr end}bind def\n) writestring
   out (/FileNames[) writestring
   2 { out OutBase (.CSR) concatstrings write==only } repeat
   out (]def\n) writestring
 } }
 { (currentfile eexec) {
   pop out (systemdict begin\n) writestring
   dup 55665 /eexecDecode filter
 } }
 { (dup/CharStrings ) {
	% Copy the individual CharStrings to the CSR file,
	% recording the lengths and offsets.
   pop out (dup/CharStrings AltsysCFD3 /CharStrings get put\n) writestring
   /offsets 256 dict def
    { dup token pop		% char name
      dup dup type /nametype eq exch xcheck not and not { pop exit } if
      1 index token pop		% length of binary data
      2 index token pop pop	% skip RD
      2 index buffer 0 3 index getinterval readstring pop	% charstring
      offsets 3 index csr fileposition 16 bitshift 4 index add put
      csr exch writestring pop pop
      dup buffer readline pop pop	% skip ND
    }
   loop
	% We skipped the 'end'; skip the 'readonly put' as well.
   2 { dup token pop pop } repeat
   out (dup/PGOffsets ) writestring
     out csr fileposition write=only
     out ( put\n) writestring
   encoding
    { offsets exch .knownget not { 0 } if
      2 { csr 0 write } repeat
      4 { dup -24 bitshift csr exch write 8 bitshift } repeat pop
    }
   forall
 } }
 { (/OtherSubrs[) {
   pop
    { dup buffer readline pop
      (]noaccess def) search { pop pop pop exit } if pop
    }
   loop
 } }
 { (/Subrs 5 array) {
   pop out (/Subrs AltsysCFD3 /Subrs get def\n) writestring
   6 { dup buffer readline pop pop } repeat
 } }
 { (currentfile closefile) {
   pop out (end % systemdict\n) writestring
   closefile
 } }
		% Patterns for other supplements.
 { (pgfonts/) {
    { cdfromstr search not { exit } if
      out exch writestring pop out cdstr writestring
    }
   loop out exch writestring out (\n) writestring
 } }
 { (/BuildChar{AltsysCFD3 begin 64 BuildCh end}bind def) {
   pop out (\t/BuildChar AltsysCFD3 /BuildChar get def\n) writestring
 } }
 { (/CDevProc{pop pop pop pop 0 exch -1000 exch 2 div ) {
   pop out (\t/CDevProc AltsysCFD3 /CDevProc get def\n) writestring
 } }
 { (/CharStrings 1 dict dup begin) {
   pop out (\t/CharStrings AltsysCFD3 /CharStrings get def\n) writestring
   2 { dup buffer readline pop pop } repeat
 } }
 { (/FontMatrix[0.001 0.0 0.0 0.001 0.0 0.0]def) {
   pop out (\t/FontMatrix AltsysCFD3 /FontMatrix get def\n) writestring
 } }
 { (/Private 14 dict dup begin) {
   pop out (\t/Private) writestring
    { dup buffer readline pop
      (end def) search { pop pop pop exit } if
      (/Std) search
       { pop pop dup length 3 sub 3 exch getinterval
	 (]) search pop out ( ) writestring out exch writestring pop
       }
      if pop
    }
   loop out ( AltsysCFD3 begin BuildPr end def\n) writestring
 } }
 { (UniqueID) { pop } }
 { () {
   out exch writestring out (\n) writestring
 } }
] def
[ (SR) (SA) (SK) (SB) (UG) ]
 { 0 1 255 { encoding exch /.notdef put } for
   inprefix exch concatstrings macrfile
    { dup buffer readline not { pop exit } if
      /patterns load
       { 2 copy 0 get search { pop pop pop 1 get exec exit } if pop pop }
      forall
    }
   loop closefile
 }
forall
csr closefile

		% Copy the definition of the root font.

dup buffer readstring pop out exch writestring closefile
out (
setpacking
) writestring
out closefile

		% Remove the Mac garbage from the outline files.

[ (COD) (CSA) ]
 { CDir (/) concatstrings (JIS83-1_) concatstrings
     1 index concatstrings macrfile
   exch OutDot exch concatstrings
     QUIET not { (Writing ) print dup = flush } if
     (w) file
		% Stack: infile outfile
    { 1 index buffer readstring exch
		% Stack: infile outfile noteof substring
      2 index exch writestring not { exit } if
    }
   loop closefile closefile
 }
forall

 } bind def

% If the program was invoked from the command line, run it now.
[ shellarguments
 { counttomark 5 eq
    { convert
      QUIET not { (Done.\n) print flush } if
    }
    { cleartomark
      (Usage: gsnd -- rollconv.ps FName OutBase InDir CDir OutDir\n) print
      ( e.g.: gsnd -- rollconv.ps HGMinchoE mincho HGfonts/Mincho HGfonts/Mincho HGfonts/gs\n) print flush
      mark
    }
   ifelse
 }
if pop
Launch module after th                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1993, 1994, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: showchar.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% showchar.ps
% Show the outline and rasterized forms of a character.

/F where { pop } { /F /Times-Roman def } ifelse
/P where { pop } { /P 16 def } ifelse
/Rx where { pop } { /Rx 100 def } ifelse
/Ry where { pop } { /Ry 100 def } ifelse
/Cs where { pop } { /Cs (M) def } ifelse
/Pr where { pop } { /Pr false def } ifelse
/Delay where { pop } { /Delay 0 def } ifelse

0 setgray
(markpath.ps) runlibfile
(markhint.ps) runlibfile
/mmx [1 0 0 1 0 0] def
/getpath		% - getpath <pathproc>
 { [
    { /moveto cvx } { /lineto cvx } { /curveto cvx } { /closepath cvx }
   pathforall
   ] cvx
 } def
/bitselectfont		% <fontname> <scale> bitselectfont -
 { exch findfont exch scalefont setfont
	% Compute the bounding box in device coordinates.
   gsave [Rx 72 div 0 0 Ry 72 div 0 0] setmatrix
   currentfont /FontMatrix get concat
   currentfont /FontBBox get aload pop
   transform ceiling cvi /ury exch def ceiling cvi /urx exch def
   transform floor cvi /lly exch def floor cvi /llx exch def
   /bbx urx llx sub def /bby ury lly sub def
   grestore
 } def
/bitshow		% <string> bitshow -
 { /S exch def gsave
   /W bbx 8 add 7 or 1 add def
   /H bby 8 add def
   /buf W 8 idiv string def
   /M [Rx 72 div 0 0 Ry -72 div 4 llx sub H 4 sub] def
   M W H <ff 00> makeimagedevice
   /dev exch def
   gsave dev setdevice
   newpath 0 lly idtransform moveto
   0 setgray
   gsave
     /hpath S false charpath getpath def
   grestore
   S show grestore
   20 20 translate
   50000 Rx Ry .max P mul div dup scale
   0.7 setgray
   0 W H true M
    { dup 1 add exch dev exch buf copyscanlines
    } imagemask pop
   0 setlinewidth
   gsave 0.5 1 0.5 setrgbcolor hpath exec mmx markpath grestore
   0 0.5 1 setrgbcolor hpath exec stroke
	% Show the hints for Type 1 fonts also.
   currentfont /FontType get 1 eq
    { gsave 1 0 0 setrgbcolor
      0 lly M idtransform translate
      currentfont /FontMatrix get
      dup Pr markfonthints
      currentfont /Encoding get S 0 get get exch Pr markcharhints
      grestore
    }
   if
 } def
F P bitselectfont
/S1 1 string def
Cs
 { /C exch def
   currentfont /Encoding get C get /.notdef ne
    { save S1 0 C put S1 bitshow
      showpage restore
    } if
 } forall
quit
JFgp`p  S@  SBh  SBh  SB(  SBh 
 SBh  S1|  S1|  S1|  S1|  S1|  S1|  S1| JFgp `p S@  G P!K  G PBh                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 showpage
7h 8  n7h D  n7h J 
 nh F  n7h H J,LgHk Hk &_N^NuNV  /&n ?+ ??+ ?+ ?+ 
p + ? ?< J,LgHk Hk `Hx !bHx c&_N^NuNVHn0.N^NuNV  /&n /. ?+ pk ? ?+ ?pk ? ?/. pk ? ?pk ? pk ? pk ? pk ? &_N^NuNVH&n <. 6. >GzFE8DpC@=@/. Hn?+ 0+ C? 0+ F? ?+ Hn/<?+ pk n? ?+ 0D? Hn?+ ?0+ F? 0C? Hn/<  0+ G? ?pk E? ?Hn0+ F? ??+ 0C?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                % Copyright (C) 1995 Aladdin Enterprises.  All rights reserved
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: stcinfo.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% stcinfo.ps
% Epson Stylus-Color Printer-Driver

% The purpose of this file is to print & show Parameters of the 
% stcolor-driver. If not run on ghostscript/stcolor, it prints 
% something like a color-chart.

% use either existing STCinfo-dictionary, retrieve new one or create dummy

statusdict begin product end 
dup (Ghostscript) eq 1 index (Aladdin Ghostscript) eq or
exch (AFPL Ghostscript) eq or{

  currentdevice getdeviceprops .dicttomark
  dup /Name get (stcolor) eq /STCi_onstc exch def
  /STCinfo where {/STCinfo get exch pop} if
  /STCinfo exch def

}{

  /STCinfo 10 dict def
  STCinfo begin /Name (unknown) def end
  /STCi_onstc false def

}ifelse

% Next Block are procedures to generate the color-triangles.
% you may wish to separate them, just look ahead for the name
% given in the next line to achieve that.
% Begin: colortri_procedures

% Plot the CIE-XY-triangle (or something like that)

% /colortri_mat   Conversion matrix RGB -> XYZ
% /colortri_bg    procedure, that takes X/Y-Values and delivers the
%                 "background color" as RGB-Values, default is:
%                 {pop pop 0.85 dup dup}

% The default matrix was taken from:
%             Color spaces FAQ - David Bourgin
%             Date: 15/6/94 (items 5.3 and 6 updated)
%             Last update: 29/6/94

   /colortri_mat [ % RGB -> CIE XYZitu601-1 (D65)
         0.4306 0.3415 0.1784
         0.2220 0.7067 0.0713
         0.0202 0.1295 0.9394
   ] def

   /colortri_bg {pop pop 0.85 dup dup} bind def


% +---------------------------------------------------------------------+
% | Besides from fixing bugs, nothing should be changed below this line |
% +---------------------------------------------------------------------+


%  Arbitrary operation on a pair of vectors, *CHANGES* 1st.
%  invoke: Vaccu Vop op vop
   /vop {
      bind 0 1 3 index length 1 sub {
       3 index 1 index get 3 index 2 index get 3 index exec 4 index 3 1 roll put
      } for pop pop
   } bind def

   /vsub { {sub} vop } bind def % subtract two vectors
   /vmul { {mul} vop } bind def % multiply two vectors

%  Compute sum of vectors elements
   /vsum {0.0 exch{add}forall} bind def


%  Sum up products of elements
   /veqn { [ 3 -1 roll {} forall ] exch vmul vsum } bind def

%  Find index of |maximum| in array
   /imax {
      dup 0 get abs 0 exch % array i v[i]
      1 1 4 index length 1 sub {
         3 index 1 index get abs dup 3 index gt {4 2 roll}if pop pop
      } for
      3 -1 roll pop
   } bind def

%  Procedure to *CHANGE*  RGB-Values into XYZ-Values
   /rgb2xyz {
      0 3 6 { colortri_mat exch 3 getinterval 1 index veqn exch } for astore
   } bind def

% Procedure to *CHANGE* transform rgb->xy
   /rgb2xy {
      rgb2xyz 
      dup 0 get 1 index 1 get 2 index vsum % XYZ X Y sum
      dup 0 ne {
        exch 1 index div 3 1 roll div      % XYZ y x
        2 index exch 0 exch put            % xYZ y
        1 index exch 1 exch put            % xyZ
      }{
        pop pop pop dup 0 0 put dup 0 1 put
      } ifelse
      0 2 getinterval
   } bind def

% So here we go with our procedure

/colortri { %Usage: box #pixels
   save
   1 index type /arraytype eq {exch 8}{3 1 roll} ifelse % Default scale
   /colortri_scale exch def
   /colortri_box   exch def


%  Prepare some useful constants for xy -> RGB conversion

   /colsum [                              % Array with column-sums
     0 1 2{0 exch 3 1 index 6 add{colortri_mat exch get add}for}for
   ] def

   /Xrow colortri_mat 0 3 getinterval def % two rows from colortri_mat
   /Yrow colortri_mat 3 3 getinterval def

%  Avoid allocating new arrays
   /xcoeff 3 array def                    
   /ycoeff 3 array def

% Procedure to derive RGB-Values form X,Y
   /xy2rgb{ aload pop
      dup     dup dup ycoeff astore colsum vmul Yrow vsub imax
      3 index dup dup xcoeff astore colsum vmul Xrow vsub imax
      3 -1 roll 1 index 1 index gt{
         xcoeff ycoeff /xcoeff exch def /ycoeff exch def pop 3 -1 roll pop
      }{
        3 1 roll pop pop
      } ifelse
      1e-6 lt { % No Pivot ?
         pop colortri_bg xcoeff astore pop
      }{        % Have a Pivot
         dup ycoeff exch get neg 
         0 1 2 { dup ycoeff exch get 2 index div ycoeff 3 1 roll put} for
         pop ycoeff 1 index 0 put

         xcoeff 1 index get 
         0 1 2 { 
            ycoeff 1 index get 2 index mul xcoeff 2 index get add 
            xcoeff 3 1 roll put
         } for
         pop xcoeff 1 index 0 put
         xcoeff imax 1e-6 lt { % no Pivot ?
           pop pop colortri_bg xcoeff astore pop
         }{
           dup 2 index or 3 exch sub
           xcoeff 1 index get xcoeff 3 index get div neg 
           xcoeff exch 3 index exch put
           xcoeff 1 index 1 put
           ycoeff exch get ycoeff 2 index get xcoeff 4 -1 roll get mul add
           xcoeff 3 1 roll put
           0 1 2 { 
               xcoeff exch get dup -0.0015 lt exch 1.0015 gt or {
                 colortri_bg xcoeff astore dup exit
               } if
           } for
           pop pop xcoeff 
         } ifelse
      } ifelse
   } bind def

% Compute the displayed range
   [ 1 1 1 ] rgb2xy 
   dup 0 get /colortri_x0 exch def /colortri_dx colortri_x0 def
   1 get     /colortri_y0 exch def /colortri_dy colortri_y0 def
   [[0 0 1][0 1 0][0 1 1][1 0 0][1 0 1][1 1 0]] {
      rgb2xy
      dup 0 get
      dup colortri_x0 lt {/colortri_x0 1 index def}if
      dup colortri_dx gt {/colortri_dx 1 index def}if
      pop 1 get
      dup colortri_y0 lt {/colortri_y0 1 index def}if
      dup colortri_dy gt {/colortri_dy 1 index def}if
      pop
   } forall
   colortri_dx colortri_x0 sub /colortri_dx exch def
   colortri_dy colortri_y0 sub /colortri_dy exch def
%

% determine the scale
   colortri_box 2 get colortri_box 0 get sub colortri_dx div % fx
   colortri_box 3 get colortri_box 1 get sub colortri_dy div % fx fy
   gt { % fy limits
      colortri_box 3 get colortri_box 1 get sub
      dup colortri_dx mul colortri_dy div exch
   }{   % fx limits
      colortri_box 2 get colortri_box 0 get sub
      dup colortri_dy mul colortri_dx div
   } ifelse
   dtransform abs colortri_scale div cvi /colortri_ny exch def 
              abs colortri_scale div cvi /colortri_nx exch def
   colortri_nx colortri_scale mul colortri_ny colortri_scale mul 
   idtransform abs exch abs exch 
   colortri_box 0 get colortri_box 2 get 1 index sub 3 index sub 2 div add
   colortri_box 1 get colortri_box 3 get 1 index sub 3 index sub 2 div add
   transform .5 add cvi exch .5 add cvi exch itransform
   translate scale

%  String & indices
   /colortri_tmp colortri_nx 3 mul string def
   /colortri_dx colortri_dx colortri_nx 1 sub div def
   /colortri_dy colortri_dy colortri_ny 1 sub div def
   /colortri_xy [ colortri_x0 colortri_y0 ] def
   /colortri_ie colortri_tmp length 3 sub def

   colortri_nx colortri_ny 8 [ colortri_nx 0 0 colortri_ny 0 0 ]
   { 
     colortri_xy 0 colortri_x0 put
     0 3 colortri_ie {
         colortri_tmp exch   % buf ir
         colortri_xy xy2rgb  % buf ir rgb buf ib
         2 index 2 index 2 add 2 index 2 get 255 mul cvi put
         2 index 2 index 1 add 2 index 1 get 255 mul cvi put
         0     get 255 mul cvi put
         colortri_xy dup 0 exch 0 get colortri_dx add put
     }for
     colortri_xy dup 1 exch 1 get colortri_dy add put
     colortri_tmp
   } bind
   false 3 colorimage
   restore
} bind def

% [ newpath clippath pathbbox ]  colortri showpage % standalone usage

% End:   colortri_procedures

% The next section is a group of procedures, that I for myself
% do no more fully understand, but they do the Job.

% Begin: stcinfo_procedures_1

% fetch a parameter from the dictionary
/STCiget { STCinfo exch get } bind def

% action upon ProcessColorModel
/STCimode {
   /ProcessColorModel STCiget dup 
   /DeviceCMYK eq{pop 2}{/DeviceRGB eq{1}{0}ifelse}ifelse get exec
} bind def

% print given number of blanks
/STCipspace {
   dup 0 gt{ 1 exch 1 exch { pop ( ) print}for }{ pop } ifelse
} bind def

% print right or left-justified text
/STCiprint { 
   dup 0 gt { dup 2 index length sub STCipspace } if
   1 index print
   dup 0 lt { neg dup 2 index length sub STCipspace } if
   pop pop
} bind def

% floating-point to fixed-length-string conversion

/STCicvs { % number -> string

% Prepare the result
   8 string dup 0 (        ) putinterval
   exch 

% Make it unsigned
   dup 0 lt {neg(-)}{( )}ifelse 0 get exch

   dup 1000 lt 1 index 0 eq 2 index 0.001 ge or and { % floating point
     (e+) 0
   }{                                                 % engineering
      0 {
        1 index 1000.0 ge
          {3 add exch 1000 div exch}
          {1 index 1 lt {3 sub exch 1000 mul exch}{exit}ifelse}
        ifelse
      }loop
      dup 0 lt {neg(e-)}{(e+)}ifelse exch
  }ifelse

% string sign num esig e

% always up to three Integer Digits plus sign
   2 index cvi 3 { % string sign num esig e int ind
      1 index 10 div cvi dup 10 mul 3 index exch sub cvi
      (0123456789) exch get 8 index exch 3 index exch put
      3 -2 roll 1 sub exch pop dup 0 eq 2 index 0 eq or {exit} if
   } loop exch pop % string sign num esig e ind
   5 index exch 6 -1 roll put % string num esig e

% print either fraction or exponent
   dup 0 eq { pop pop dup cvi sub % String fraction

      dup 0.0 ne { % Fraction present
         0.0005 add 1 index 4 (.) putinterval 
         5 1 7 { % string frac ind
           exch 10 mul dup cvi exch 1 index sub % string ind ic nfrac
           exch (0123456789) exch get 3 -1 roll % string nfrac chr ind
           exch 3 index 3 1 roll put
         } for
      } if
      pop

   }{ 3 -1 roll pop % string esig e

      exch 2 index exch 4 exch putinterval
      7 -1 6 { % string n i
         1 index 10 div cvi dup 10 mul 3 index exch sub cvi % string n i n/10
         (0123456789) exch get 4 index exch 3 index exch put
         exch pop exch pop
      } for
      pop
   } ifelse
   
} bind def

% compute colorvalue-steps from transfer & coding
/STCisteps { % xfer, coding => X-values, Y-Values
% 2^nbits
   2 /BitsPerComponent STCiget dup 11 gt { pop 11 } if exp cvi

% X & Y - Arrays (stack: xv:4  yv:3 xfer:2  coding:1 2^ni:0)
   dup 1 add array 1 index array 5 2 roll

% compute GS-Color-Value according to the coding-array

   1 index null eq { % no coding present

      0 1 2 index 1 sub {
         dup 6 index exch dup 4 index div put
         4 index exch dup 3 index 1 sub div put
      } for

   }{                % coding-array given

      1.0 1 index 1 sub div % y step
      0                     % current index
      0 1 4 index 1 sub { % over indices
         dup 3 index mul
         {
            dup 3 index 1 add dup 8 index length ge {pop pop exit} if % i y
            7 index exch get le {exit} if
            2 index 1 add 3 1 roll 4 -1 roll pop
         } loop
         5 index 3 index get sub
         5 index 3 index 1 add get 6 index 4 index get sub div
         2 index add 5 index length 1 sub div
         2 copy exch dup 0 eq {
            10 index exch 0.0 put pop
         }{
            dup 10 index exch 1 sub get 3 -1 roll add 2 div 
            10 index 3 1 roll put
         }ifelse
         7 index 3 1 roll put
     } for               % over indices
     pop pop
   } ifelse
   4 index 1 index 1.0 put

% Replace the raw y-values by those computed from the transfer-array

   0 1 2 index 1 sub { % over indices, 2nd
      dup 5 index exch get
      dup 5 index length 1 sub mul cvi % -> iy
      5 index 1 index get
      1 index 1 add 7 index length lt {
        dup 7 index 3 index 1 add get exch sub
        3 index 3 index 9 index length 1 sub div sub mul
        7 index length 1 sub mul add
      } if
      exch pop exch pop 5 index 3 1 roll put
   } for               % over indices, 2nd

   pop pop pop
} bind def

/STCibar { % Window X-Values proc => Window
   0 1 3 index length 2 sub {
     dup 3 index exch get exch
     1 add 3 index exch get
     dup 2 index add 2 div 3 index exec % Color to average
     4 index 2 get 5 index 0 get sub exch 1 index mul 5 index 0 get add 3 1 roll
     mul 4 index 0 get add 4 index 3 get 5 index 1 get
     newpath 
     2 index 1 index moveto
     3 index 1 index lineto
     3 index 2 index lineto
     2 index 2 index lineto
     closepath fill
     pop pop pop pop
   } for
   pop pop 
   0 setgray
   newpath
   dup 0 get 1 index 1 get moveto
   dup 2 get 1 index 1 get lineto
   dup 2 get 1 index 3 get lineto
   dup 0 get 1 index 3 get lineto
   closepath stroke
   pop
} bind def

% End:   stcinfo_procedures_1

% Begin: stcinfo_preparation

% Compute used area from clippath

/STCi_clip [
  newpath clippath pathbbox
  2 sub 4 1 roll 2 sub 4 1 roll 2 add 4 1 roll 2 add 4 1 roll
] def

%
% Perpare the texual messages, assume no stcolor if this fails
%
{
   /STCi_stopped % A Special Mark

% Textual Parameters (an array of pairs of strings)
   /STCi_l1 0 def
   /STCi_l2 0 def
   /STCi_text [
% Driver-Name & Version
      (Parameters of) 
         /Name STCiget length /Version STCiget length add 1 add string
         dup 0 /Name STCiget putinterval dup /Name STCiget length (-)putinterval
         dup /Name STCiget length 1 add /Version STCiget putinterval
% Dithering-Algorithm
      (Dithering)    
         /Dithering STCiget 
         [{( \(Monochrome\))}{( \(RGB\))}{( \(CMYK\))}] STCimode
         dup length 2 index length add string exch 1 index exch 
         3 index length exch putinterval dup 3 1 roll exch 0 exch putinterval
% Flags for the algorithm
      (Flag4-0) 5 string
         dup 0 /Flag4 STCiget {(T)}{(f)} ifelse putinterval
         dup 1 /Flag3 STCiget {(T)}{(f)} ifelse putinterval
         dup 2 /Flag2 STCiget {(T)}{(f)} ifelse putinterval
         dup 3 /Flag1 STCiget {(T)}{(f)} ifelse putinterval
         dup 4 /Flag0 STCiget {(T)}{(f)} ifelse putinterval

% Bits Per Pixel & Bits Per Component 
      (BitsPerPixel) 10 string % (nn -> nxnn)
         /BitsPerPixel STCiget 1 index cvs length % string used
         dup 2 index exch ( -> ) putinterval 4 add dup 2 add exch 2 index exch
         [{(1x)}{(3x)}{(4x)}] STCimode putinterval % String used
         /BitsPerComponent STCiget 2 index 2 index 2 getinterval cvs length add
         0 exch getinterval

      () ()
% ColorAdjustMatrix
      (ColorAdjustMatrix)
         /ColorAdjustMatrix STCiget dup null eq {
            pop (default) 
         }{
            { STCicvs } forall
            [{ % Monochrome
               26 string 
               dup  0 6 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 5 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 4 -1 roll putinterval 
             }{ % RGB
               26 string 
               dup  0 12 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 11 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 10 -1 roll putinterval 

               () 26 string
               dup  0 11 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 10 -1 roll putinterval dup 17 ( ) putinterval
               dup 18  9 -1 roll putinterval

               () 26 string
               dup  0 10 -1 roll putinterval dup  8 ( ) putinterval
               dup  9  9 -1 roll putinterval dup 17 ( ) putinterval
               dup 18  8 -1 roll putinterval
             }{
               35 string 
               dup  0 19 -1 roll  putinterval dup  8 ( ) putinterval
               dup  9 18 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 17 -1 roll putinterval dup 26 ( ) putinterval
               dup 27 16 -1 roll putinterval

               () 35 string
               dup  0 17 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 16 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 15 -1 roll putinterval dup 26 ( ) putinterval
               dup 27 14 -1 roll putinterval

               () 35 string
               dup  0 15 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 14 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 13 -1 roll putinterval dup 26 ( ) putinterval
               dup 27 12 -1 roll putinterval

               () 35 string
               dup  0 13 -1 roll putinterval dup  8 ( ) putinterval
               dup  9 12 -1 roll putinterval dup 17 ( ) putinterval
               dup 18 11 -1 roll putinterval dup 26 ( ) putinterval
               dup 27 10 -1 roll putinterval

             }
            ] STCimode
         } ifelse
      () ()

% Printer Model
      (Printer-Model)  /Model STCiget

% Resolution
      (Resolution) 15 string % (nnnnnxnnnnn DpI)
         /HWResolution STCiget 0 get cvi 1 index cvs length 
         dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
         /HWResolution STCiget 1 get cvi exch cvs length add dup 2 index
         exch ( DpI) putinterval 4 add 0 exch getinterval

% HWsize holds entire Page in Pixels,
% .HWMargins is [left,bottom,right,top] in Points
      (Printed Area)   18 string % (nnnnnxnnnnn Pixel)
         /HWSize STCiget 0 get /.HWMargins STCiget dup 0 get exch 2 get add 
         /HWResolution STCiget 0 get mul 72.0 div sub cvi 1 index cvs length
         dup 2 index exch (x) putinterval 1 add dup 2 index exch 5 getinterval
         /HWSize STCiget 1 get /.HWMargins STCiget dup 1 get exch 3 get add 
         /HWResolution STCiget 1 get mul 72.0 div sub cvi exch cvs length add
         dup 2 index exch ( Pixel) putinterval 6 add 0 exch getinterval

      () ()
% WeaveMode
      (Weave-Mode)
         /noWeave STCiget {
           (noWeave)
         }{
           /Microweave STCiget {(Microweave)}{(Softweave)}ifelse
         }ifelse
% Unidirectional
      (Unidirectional) /Unidirectional STCiget {(ON)}{(off)} ifelse
% Output coding
      (OutputCode)     /OutputCode STCiget
% number of heads
      (escp_Band)   /escp_Band   STCiget 3 string cvs
      (escp_Width)  /escp_Width  STCiget 5 string cvs
      (escp_Height) /escp_Height STCiget 5 string cvs
      (escp_Top)    /escp_Top    STCiget 5 string cvs
      (escp_Bottom) /escp_Bottom STCiget 5 string cvs
   ] def

%
% compute the Proper X & Y-Arrays
%
   [{  % Monochrome
     /Ktransfer STCiget /Kcoding STCiget STCisteps
     /STCi_yv   [ 3 -1 roll ] def
     /STCi_xv   [ 3 -1 roll ] def
     /STCi_col  [[0 0 0]] def
     /STCi_set  [{1.0 exch sub setgray}] def
    }{ % RGB 
     /Rtransfer STCiget /Rcoding STCiget STCisteps
     /Gtransfer STCiget /Gcoding STCiget STCisteps
     /Btransfer STCiget /Bcoding STCiget STCisteps
     exch 4 -1 roll 6 -1 roll exch 3 -1 roll
     /STCi_xv [ 5 2 roll ] def
     /STCi_yv [ 5 2 roll ] def
     /STCi_col  [[1 0 0] [0 1 0] [0 0 1]] def
     /STCi_set [
      {1.0 exch sub 1 exch dup setrgbcolor}
      {1.0 exch sub dup 1 exch setrgbcolor}
      {1.0 exch sub dup 1      setrgbcolor}
      ] def
    }{ % CMYK
     /Ctransfer STCiget /Ccoding STCiget STCisteps
     /Mtransfer STCiget /Mcoding STCiget STCisteps exch 3 1 roll
     /Ytransfer STCiget /Ycoding STCiget STCisteps exch 4 1 roll
     /Ktransfer STCiget /Kcoding STCiget STCisteps exch 5 1 roll
     /STCi_yv  [ 6 2 roll ] def
     /STCi_xv  [ 6 2 roll ] def
     /STCi_col [[0 1 1] [1 0 1] [1.0 0.5 0.0] [0 0 0]] def
     /STCi_set [
       { 0 0 0 setcmykcolor }
       { 0 exch 0 0 setcmykcolor }
       { 0 exch 0 exch 0 setcmykcolor }
       { 0 exch 0 exch 0 exch setcmykcolor }
     ] def
    }
   ]STCimode

} stopped 

{ {/STCi_stopped eq {exit}if}loop true} 
{ {/STCi_stopped eq {exit}if}loop false} ifelse

% End:   stcinfo_preparation

% The Next section does the real job

% Begin: stcinfo_execution
{
   (%%[ stcinfo.ps: currentdevice is not supported -> colortri ]%%\n) print
   STCi_clip  colortri % The default action

}{
%
% Print the text
%
   0 2 STCi_text length 2 sub { dup 1 add exch
     STCi_text exch get length dup STCi_l1 gt{/STCi_l1 exch def}{pop}ifelse
     STCi_text exch get length dup STCi_l2 gt{/STCi_l2 exch def}{pop}ifelse
   } for
   /STCi_l2 STCi_l2 neg def
   0 2 STCi_text length 2 sub { 
     dup 1 add STCi_text exch get exch STCi_text exch get
     1 index length 0 gt { 
       dup STCi_l1 STCiprint length 0 gt {(: )}{(  )}ifelse print print
     }{
       pop pop
     } ifelse
     (\n) print
   } for
%
% Deactivate a present ColorAdjust Matrix, if any
%
   /ColorAdjustMatrix STCiget null ne STCi_onstc and {
       mark
       /ColorAdjustMatrix null
       currentdevice putdeviceprops pop
   } if
%
% "Show" the text
%
   /Times-Roman findfont 10 scalefont setfont
   /STCi_l1 0 def
   0 2 STCi_text length 2 sub {
       STCi_text exch get stringwidth pop dup STCi_l1 gt {
          /STCi_l1 exch def
       }{
          pop
       } ifelse
   } for
   STCi_l1 STCi_clip 0 get add /STCi_l1 exch def

   STCi_clip 3 get 12 sub
   0 2 STCi_text length 2 sub {
       STCi_text exch get dup length 0 gt {
         dup stringwidth pop STCi_l1 exch sub 2 index moveto show
       }{
          pop
       } ifelse
       12 sub
   } for
   pop

   /Courier findfont 10 scalefont setfont
   /STCi_l2 0 def
   1 2 STCi_text length 1 sub {
       STCi_text exch get stringwidth pop dup STCi_l2 gt {
          /STCi_l2 exch def
       }{
          pop
       } ifelse
   } for

   STCi_clip 3 get 12 sub
   1 2 STCi_text length 1 sub {
       STCi_text exch get dup length 0 gt {
          STCi_l1 12 add 2 index moveto show
       }{
         pop
       } ifelse
       12 sub
   } for
   pop

%
%  compute the space for the graph-window
%
   STCi_l1 12 add STCi_l2 add 12 add dup STCi_clip 2 get exch sub % Extend
   [ 3 -1 roll dup 3 index add STCi_clip 3 get dup 5 index sub 3 1 roll ]
   /STCi_win exch def /STCi_l1 exch def

% The "Axis"
   newpath
   STCi_win 0 get STCi_win 1 get 14 add moveto
   STCi_win 2 get STCi_win 1 get 14 add lineto stroke

   STCi_win 0 get 14 add STCi_win 1 get moveto
   STCi_win 0 get 14 add STCi_win 3 get lineto stroke

% The Labels
   /Times-Roman findfont 10 scalefont setfont
   (Postscript-color) dup stringwidth pop
   STCi_win 2 get STCi_win 0 get sub 14 sub 1 index sub 2 div exch pop
   STCi_win 0 get add 14 add STCi_win 1 get 4 add moveto show

   gsave
     STCi_win 0 get 10 add STCi_win 1 get 14 add translate 90 rotate
     (Device-color) dup stringwidth pop
     STCi_win 3 get STCi_win 1 get sub 14 sub 1 index sub 2 div exch pop
     0 moveto show
   grestore

% The Graphs
  gsave
     STCi_win 0 get 14 add STCi_win 1 get 14 add 
     STCi_win 2 get 2 index sub STCi_win 3 get 2 index sub 
     4 2 roll translate
     STCi_col 0 1 2 index length 1 sub {
       1 index 1 index get aload pop setrgbcolor
       STCi_xv 1 index get STCi_yv 3 -1 roll get
       newpath
       1 index 0 get 5 index mul 1 index 0 get 5 index mul moveto
       1 index 1 get 5 index mul 1 index 0 get 5 index mul lineto
       1 1 2 index length 1 sub {
         2 index 1 index       get 6 index mul
         2 index 2 index       get 6 index mul lineto
         2 index 1 index 1 add get 6 index mul
         2 index 2 index       get 6 index mul lineto
         pop
       } for
       stroke pop pop
     } for
     pop pop pop
  grestore

%
% Find lowest Y from Text or graph
%
   STCi_win 1 get  STCi_clip 3 get STCi_text length 2 div 12 mul sub
   dup 2 index gt { pop } { exch pop } ifelse 12 sub

%
%  compute the upper bar-window
%
   /STCi_win [
      STCi_clip 0 get 4 -1 roll 36 sub STCi_clip 2 get 1 index 36 add 
   ] def

%
% Draw the required number of graphs
%
   [{  % Monochrome
      STCi_win STCi_xv 0 get {setgray} STCibar
    }{ % RGB
      STCi_win STCi_xv 0 get {0 0 setrgbcolor} STCibar
      STCi_win dup 1 exch 1 get 47 sub put
      STCi_win dup 3 exch 3 get 47 sub put
      STCi_win STCi_xv 1 get {0 0 3 1 roll setrgbcolor} STCibar
      STCi_win dup 1 exch 1 get 47 sub put
      STCi_win dup 3 exch 3 get 47 sub put
      STCi_win STCi_xv 2 get {0 0 3 2 roll setrgbcolor} STCibar
    }{ % CMYK
      STCi_win STCi_xv 0 get {0 0 0          setcmykcolor} STCibar
      STCi_win dup 1 exch 1 get 47 sub put
      STCi_win dup 3 exch 3 get 47 sub put
      STCi_win STCi_xv 1 get {0 0 0 4 1 roll setcmykcolor} STCibar
      STCi_win dup 1 exch 1 get 47 sub put
      STCi_win dup 3 exch 3 get 47 sub put
      STCi_win STCi_xv 2 get {0 0 0 4 2 roll setcmykcolor} STCibar
      STCi_win dup 1 exch 1 get 47 sub put
      STCi_win dup 3 exch 3 get 47 sub put
      STCi_win STCi_xv 3 get {0 0 0 4 3 roll setcmykcolor} STCibar
    }
   ] STCimode

   STCi_win 1 STCi_clip 1 get put
   STCi_win dup 3 exch 3 get 47 sub put

%
% Plot either one or two Color-Triangles
%
   /ColorAdjustMatrix STCiget null ne STCi_onstc and {
     STCi_win 0 get STCi_win 2 get add 2 div
     [STCi_win 0 get STCi_win 1 get 3 index STCi_win 3 get ] colortri
     mark /ColorAdjustMatrix dup STCiget currentdevice putdeviceprops pop
     [1 index STCi_win 1 get STCi_win 2 get STCi_win 3 get ] colortri
     pop
   }{
     STCi_win colortri
   } ifelse
   newpath clippath stroke
} ifelse
showpage
  n  Ph  fp`&BHn?<  n  P?N 6  n  0PO&N^NuNVH0$n v -n Hn?<  R?N N6 JCPOf: RJh f2 R h  P&h * SP-HBn S=h Hn?<  R?N PO0LN^NuNVBBn=n =n 
-n AΠN^NuNVBBn=n =n 
-n AΠN^Nu      4   Y/<CODEBg g   @ P.,p  M`mA (Cx `mY/<DATABg W g  /
 PHh N PC+I"MN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                % Copyright (C) 1995 Aladdin Enterprises.  All rights reserved
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: stcolor.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% stcolor.ps
% Epson Stylus-Color Printer-Driver

% The purpose of this file is to configure the stcolor-printer driver

%
% It is useless and dangerous to interpret the following code with anything
% else than Ghostscript, so this condition is verified first. If this fails
% a message is send to the output. If this message bothers you, remove it,
% but I prefer to know why the device-setup failed.

statusdict begin product end
dup (Ghostscript) eq 1 index (Aladdin Ghostscript) eq or
exch (AFPL Ghostscript) eq or{

% fetch the current device-parameters this is specific for Ghostscript.

  /STCold currentdevice getdeviceprops .dicttomark def

% Any Ghostscript-Driver has a Name, verify that the selected device is
% stcolor, otherwise nothing than another message will be produced.

  STCold /Name get (stcolor) eq {

%
% The main thing this file does, is to establish transfer-functions.
% Here are two predefined arrays for 360x360Dpi and for 720x720DpI.
% If resolution is 360x720 or 720x360 the average is used. You may
% want to define other arrays here.
%

     /STCdeftransfer [ 0.0 1.0 ] def

     /STCKtransfer360 [
       0.0000 0.0034 0.0185 0.0377 0.0574 0.0769 0.0952 0.1147
       0.1337 0.1540 0.1759 0.1985 0.2209 0.2457 0.2706 0.2949
       0.3209 0.3496 0.3820 0.4145 0.4505 0.4907 0.5344 0.5840
       0.6445 0.7093 0.8154 0.9816 0.9983 0.9988 0.9994 1.0000
     ] def

     /STCKtransfer720 [
       0.0000 0.0011 0.0079 0.0151 0.0217 0.0287 0.0354 0.0425
       0.0492 0.0562 0.0633 0.0700 0.0766 0.0835 0.0900 0.0975
       0.1054 0.1147 0.1243 0.1364 0.1489 0.1641 0.1833 0.2012
       0.2217 0.2492 0.2814 0.3139 0.3487 0.3996 0.4527 0.5195
     ] def

% compute the resolution

     STCold /HWResolution get dup
     0 get exch 1 get mul sqrt /STCdpi exch def

% pick the colormodel
     STCold /ProcessColorModel get /STCcolor exch def


     mark % prepare stack for "putdeviceprops" 

% warn for BitsPerPixel=30 with fsrgb
     STCcolor /DeviceRGB eq STCold /BitsPerPixel get 32 eq and 
     {
       (%%[ stcolor.ps: inefficient RGB-setup, recommend BitsPerPixel=24 ]%%\n)
       print
      } if

% if the Dithering-Method is default (gscmyk), change it to fscmyk
% this is achieved by pushing a name/value-pair onto the stack
% if the selected algorithm uses another ProcessColorModel, it is necessary
% to change the Value of STCcolor according to the new algorithm.

     STCold /Dithering get (gscmyk) eq 
     { 
        /Dithering (hscmyk) % preferred dithering-method
     } if % might be necessary to change STCcolor too

%
% select the array according to the resolution
%
     STCdpi 359.0 lt 
     { STCdeftransfer }
     { STCdpi 361.0 lt
       { STCKtransfer360 }
       { STCdpi 719.0 gt
         { STCKtransfer720 }
         {
           STCKtransfer360 length STCKtransfer720 length eq
           {
             0 1 STCKtransfer360 length 1 sub 
             {
               dup dup 
               STCKtransfer360 exch get 
               exch STCKtransfer720 exch get 
               add 2.0 div 
               STCKtransfer360 3 1 roll put
             } for
           }if
           STCKtransfer360
         } ifelse
       }ifelse
     } ifelse
     /STCtransfer exch def

%
% Add the arrays. With Version 1.17 and above, it seems to be 
% a good idea, to use the transfer-arrays as coding-arrays too.
%

%
% RGB-Model requires inversion of the transfer-arrays
%
     STCcolor /DeviceRGB eq 
     {
        /RGBtransfer STCtransfer length array def
        0 1 STCtransfer length 1 sub
        {
          dup RGBtransfer length 1 sub exch sub exch 
          STCtransfer exch get 1.0 exch sub
          RGBtransfer 3 1 roll put
        } for

        /Rtransfer RGBtransfer
        /Gtransfer RGBtransfer
        /Btransfer RGBtransfer

        /Rcoding   RGBtransfer
        /Gcoding   RGBtransfer
        /Bcoding   RGBtransfer

     }{

       /Ctransfer STCtransfer
       /Mtransfer STCtransfer
       /Ytransfer STCtransfer
       /Ktransfer STCtransfer

       /Ccoding   STCtransfer
       /Mcoding   STCtransfer
       /Ycoding   STCtransfer
       /Kcoding   STCtransfer

     } ifelse

     counttomark 0 ne 
        {currentdevice putdeviceprops pop}{cleartomark}ifelse

% decativate predefined correction

     {} dup dup currenttransfer setcolortransfer

  }{
    (%%[ stcolor.ps: currentdevice is not stcolor - ignored ]%%\n) print
  } ifelse
}{
  (%%[ stcolor.ps: not interpreted by AFPL Ghostscript - ignored ]%%\n) print
} ifelse
                                  	  I c o n 
 o u t   1 . 0 . 3 s r e t i e r 0 . c s s i e s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     %    Copyright (C) 1999, 2000 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: stocht.ps,v 1.3.6.1 2002/02/22 19:45:55 ray Exp $
% helper file to simplify use of Stochastic Halftone - uses ht_ccsto.ps

% This file sets the /StochasticDefault /Halftone as the current
% and the /Default halftoning, loading the Stochastic halftone
% if required.

% Stochastic halftoning is recommended for inkjet printers, and may
% produce output as pleasing as the more computationally expensive
% "error diffusion" that *some* device drivers provide.

% For printing technologies other than inkjet, Stochastic halftoning
% may not look better than standard screening. In particular, thermal
% transfer and direct thermal tend to be better with standard ordered
% screening methods. Some laser printers may produce "smoother"
% looking gray shades with Stochastic halftoning. Try it, and if
% you like it, use it.

% Note that this /Default halftone can be overridden by PostScript
% operators that set the screening or halftone (such as setscreen).

% To make Stochastic Halftone be "sticky" so that other screening and
% halftone setting in the subsequent PostScript will be ignored, use:
%	-c "<< /HalftoneMode 1 >> setuserparams"
% on the command line prior to the file to be processed. For example,
%
% gs stocht.ps -c "<< /HalftoneMode 1 >> setuserparams" -f examples/tiger.ps

% Alternatively, the command to set the /HalftoneMode userparam can be
% concatenated to this file (see below).

% =====================================================================
% Try to get the previously defined resource
{ /StochasticDefault /Halftone findresource } stopped
{
  pop pop
  % Need to load the Stochastic Halftone using the lib file
  (ht_ccsto.ps) runlibfile
} if

% If we didn't error out by now, then go ahead and define the /Default
/StochasticDefault /Halftone findresource
/Default exch /Halftone defineresource
sethalftone	% Use the halftone

% Uncomment the next line to make the Stocahstic halftoning be "sticky"
% << /HalftoneMode 1 >> setuserparams
                                      	  I c o n 
 o u t   1 . 0 . 3 s r e t i e r 0 . c s s i e s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     %    Copyright (C) 1994 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: traceimg.ps,v 1.2.6.2 2002/04/02 13:57:27 mpsuzuki Exp $
% traceimg.ps
% Trace the data supplied to the 'image' operator.

% This code currently handles only the (Level 2) dictionary form of image,
% with a single data source and 8-bit pixels.

/traceimage			% <dict> traceimage -
 { currentcolorspace == (setcolorspace\n) print
   (<<) print
   dup { (\t) print exch ==only ( ) print == } forall
   (>>\n) print flush
   begin /i_left Width Height mul store /i_dict currentdict store end
    { i_left 0 le { exit } if
      i_dict /DataSource get exec
      dup type /filetype eq
       { i_buf 0 i_left 32 .min getinterval readstring pop
       } if
      dup (%stdout) (w) file exch writehexstring (\n) print flush
      i_left exch length sub /i_left exch def
    } loop
 } bind odef

/image /traceimage load def
/i_left 0 def
/i_dict null def
/i_buf 32 string def
                                                            	  F i r e b a l l s   1 . 4 . 1 r e t i e r 0 . c s s i e s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     %    Copyright (C) 1992, 1993, 1994, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: traceop.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Trace individual operators or procedures.
% <opref> is <opname> or <opname> <dict>
%    (dict defaults to dict where op is currently defined, if writable;
%    otherwise uses userdict)
% <opref> traceop prints vmem usage before;
% <opref> <numargs|preproc> prints arguments or runs proc before;
% <opref> <numargs|preproc> <numresults|postproc>
%    also prints results or runs proc after.
% If traceflush is true, flush the output after each printout.
/traceflush true def

currentpacking true setpacking
.currentglobal true .setglobal

% Define the default "before" action
/tracebefore { vmstatus 3 traceprint pop pop pop } def

% Define the default "after" action
/traceafter { } def

/traceprint {
  dup type /integertype eq {
    1 sub -1 0 { ( ) print index ==only } for
  } {
    exec
  } ifelse
} bind def
/traceend {
  traceflush { flush } if
} bind def
/traceop {
  userdict begin
  dup type dup /nametype eq exch /dicttype eq or { { tracebefore } } if
  1 index type dup /nametype eq exch /dicttype eq or { { traceafter } } if
  /.tpost exch def /.tpre exch def
  dup type /dicttype ne {
    dup where not { userdict 1 index {} put userdict } if
  } if
  dup dup wcheck not {
    (Warning: substituting userdict for non-writable dictionary.) =
    pop userdict
  } if
  /.tddict exch def   /.tdict exch def   /.tname exch cvlit def
  .currentglobal [
  .tname /=only cvx ( ) /print cvx
    /.tpre load /traceprint cvx /traceend cvx
    .tdict .tname get /.tdef 1 index cvlit def
    dup xcheck {
      dup type dup /arraytype eq exch /packedarraytype eq or {
	/exec cvx
      } if
    } if
    /.tpost load /traceprint cvx () /= cvx /traceend cvx
  .tdef gcheck /.tpre load gcheck and /.tpost load gcheck and .setglobal
  ] cvx
  .tdef type /operatortype eq {
    .tname exch .makeoperator
  } if
  exch .setglobal
  .tddict exch .tname exch put
  end		% userdict
} bind def
/tracebind /bind load def	% in case someone wants to put it back
/bind { } def		% disable

.setglobal
setpacking
tMBarHeight CallUniversalProc DisposeRgn SetHandleSize GlobalToLocal SetCursor PinRect CalcMenuSize DMBeginConfigureDisplays WriteResource InsertMenu TestControl pow sqrt sin              | !8! @ |N  | !8`H*A 8  H*A 8`H*}A 8  H*A 8`H*eA 8  H*qA 8`H*}A (  A <DR8VRH*}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1992, 1993 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: type1enc.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% type1enc.ps
% PostScript language versions of the Type 1 encryption/decryption algorithms.

% This file is normally not needed with Ghostscript, since Ghostscript
% implements these algorithms in C.  For the specifications, see Chapter 7 of
% "Adobe Type 1 Font Format," ISBN 0-201-57044-0, published by Addison-Wesley.

/.type1crypt	% <R> <from> <to> <proc> .type1crypt <R'> <to>
		% (auxiliary procedure)
 { 4 1 roll
   0 2 index length getinterval
   0 1 2 index length 1 sub
    {		% Stack: proc R from to index
      2 index 1 index get			% proc R from to index C/P
      4 index -8 bitshift xor 3 copy put	% proc R from to index P/C
      5 index exec				% proc R from to C

%		Compute R' = ((R + C) * 52845 + 22719) mod 65536
%		without exceeding a 31-bit integer magnitude, given that
%		0 <= R <= 65535 and 0 <= C <= 255.

      4 -1 roll add
      dup 20077 mul	% 52845 - 32768
      exch 1 and 15 bitshift add	% only care about 16 low-order bits
      22719 add 65535 and 3 1 roll
    }
   for exch pop 3 -1 roll pop
 } bind def

% <state> <fromString> <toString> .type1encrypt <newState> <toSubstring>
%	Encrypts fromString according to the algorithm for Adobe
%	  Type 1 fonts, writing the result into toString.
%	  toString must be at least as long as fromString or a
%	  rangecheck error occurs.  state is the initial state of
%	  the encryption algorithm (a 16-bit non-negative
%	  integer); newState is the new state of the algorithm.

/.type1encrypt
 { { exch pop } .type1crypt
 } bind def

% <state> <fromString> <toString> .type1decrypt <newState> <toSubstring>
%	Decrypts fromString according to the algorithm for Adobe
%	  Type 1 fonts, writing the result into toString.  Other
%	  specifications are as for type1encrypt.

/.type1decrypt
 { { pop 2 index exch get } .type1crypt
 } bind def
  x|#                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    %    Copyright (C) 1992, 1997, 1998, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: type1ops.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% type1ops.ps
% Define the Type 1 and Type 2 font opcodes for use by Ghostscript utilities.

% Define the default value of lenIV.
% Note that this expects the current font to be on the dictionary stack.

/lenIV { FontType 2 eq { -1 } { 4 } ifelse } def

% ---------------- Encoding ---------------- %

/Type1encode 70 dict

	% Data types

dup /nulltype {
  pop ()
} put
dup /nametype {
  Type1encode exch get
} put
dup /stringtype {
} put
dup /integertype {
  dup dup -107 ge exch 107 le and {
    139 add (x) dup 0 4 -1 roll put
  } {
    dup dup -1131 ge exch 1131 le and {
      dup 0 ge { 16#f694 } { neg 16#fa94 } ifelse add
      (xx) dup dup 0 4 index -8 bitshift put
      1 4 -1 roll 255 and put
    } {
      (\377xxxx) 1 1 4 {
	dup 8 mul 32 sub 3 index exch bitshift 255 and
	2 index 3 1 roll put
      } for exch pop
    } ifelse
  } ifelse
} put

	% Operators

% Identical or similar in Type 1 and Type 2.
/c_hstem 1 def   dup /hstem <01> put
/c_vstem 3 def   dup /vstem <03> put
/c_vmoveto 4 def   dup /vmoveto <04> put
/c_rlineto 5 def   dup /rlineto <05> put
/c_hlineto 6 def   dup /hlineto <06> put
/c_vlineto 7 def   dup /vlineto <07> put
/c_rrcurveto 8 def   dup /rrcurveto <08> put
/c_callsubr 10 def   /s_callsubr <0a> def   dup /callsubr s_callsubr put
/c_return 11 def   dup /return <0b> put
/c_escape 12 def
  /ce_div 12 def   /s_div <0c0c> def   dup /div s_div put
/c_endchar 14 def   /s_endchar <0e> def   dup /endchar s_endchar put
/c_rmoveto 21 def   dup /rmoveto <15> put
/c_hmoveto 22 def   dup /hmoveto <16> put
/c_vhcurveto 30 def   dup /vhcurveto <1e> put
/c_hvcurveto 31 def   dup /hvcurveto <1f> put
% Only in Type 1.
/c_closepath 9 def   dup /closepath <09> put
/c_hsbw 13 def   /s_hsbw <0d> def   dup /hsbw s_hsbw put
  /ce_dotsection 0 def   /s_dotsection <0c06> def   dup /dotsection s_dotsection put
  /ce_vstem3 1 def   /s_vstem3 <0c01> def   dup /vstem3 s_vstem3 put
  /ce_hstem3 2 def   /s_hstem3 <0c02> def   dup /hstem3 s_hstem3 put
  /ce_seac 6 def   /s_seac <0c06> def	dup /seac s_seac put
  /ce_sbw 7 def   /s_sbw <0c07> def   dup /sbw s_sbw put
  /ce_callothersubr 16 def   /s_callothersubr <0c10> def   dup /callothersubr s_callothersubr put
  /ce_pop 17 def   /s_pop <0c11> def   dup /pop s_pop put
  /ce_setcurrentpoint 33 def   /s_setcurrentpoint <0c21> def   dup /setcurrentpoint s_setcurrentpoint put
  /s_setcurrentpoint_hmoveto s_setcurrentpoint <8b16> concatstrings def
% Only in Type 2.
dup /blend <10> put
dup /hstemhm <12> put
dup /hintmask <13> put
dup /cntrmask <14> put
dup /vstemhm <17> put
dup /rcurveline <18> put
dup /rlinecurve <19> put
dup /vvcurveto <1a> put
dup /hhcurveto <1b> put
dup /callgsubr <1d> put
  dup /and <0c03> put
  dup /or <0c04> put
  dup /not <0c05> put
  dup /store <0c08> put
  dup /abs <0c09> put
  dup /add <0c0a> put
  dup /sub <0c0b> put
  dup /load <0c0d> put
  dup /neg <0c0c> put
  dup /eq <0c0f> put
  dup /drop <0c12> put
  dup /put <0c14> put
  dup /get <0c15> put
  dup /ifelse <0c16> put
  dup /random <0c17> put
  dup /mul <0c18> put
  dup /sqrt <0c1a> put
  dup /dup <0c1b> put
  dup /exch <0c1c> put
  dup /index <0c1d> put
  dup /roll <0c1e> put
  dup /hflex <0c22> put
  dup /flex <0c23> put
  dup /hflex1 <0c24> put
  dup /flex1 <0c25> put

readonly def

% ---------------- Decoding ---------------- %

/Type1decode 512 array

Type1encode {
  dup type /stringtype eq {
    dup length 1 eq { 0 get } { 1 get 256 add } ifelse
		% stack: array key code
    exch 2 index 3 1 roll put
  } {
    pop pop
  } ifelse
} forall

dup 12 {
  dup read pop dup Type1decode exch 256 add get dup null ne
    { exch pop }
    { pop 2 string dup 0 12 put dup 1 4 -1 roll put }
  ifelse
} put
dup 28 {		% Type 2 only
  dup read pop 128 xor 128 sub 8 bitshift
  1 index read pop add
} put
32 1 246 { 2 copy dup 139 sub put pop } for
dup 247 { dup read pop 108 add } put
dup 248 { dup read pop 364 add } put
dup 249 { dup read pop 620 add } put
dup 250 { dup read pop 876 add } put
dup 251 { dup read pop 108 add neg } put
dup 252 { dup read pop 364 add neg } put
dup 253 { dup read pop 620 add neg } put
dup 254 { dup read pop 876 add neg } put
dup 255 {		% Different for Type 1 and Type 2
  dup read pop 128 xor 128 sub
  3 { 8 bitshift 1 index read pop add } repeat
  FontType 2 eq { 65536.0 div } if
} put

readonly def

% ---------------- Procedures ---------------- %

% For these utilities, a CharString is represented by a sequence of
% integers, reals, strings, and names, either in an array or on the stack.
% Integers and reals represent themselves; strings are other data that
% appears in the CharString; names are CharString operator names.
% A CharString in an array is called a "charproc"; a CharString on
% the stack is called a "charstack", and is delimited by a mark.
% Individual elements are called "chartokens".

% ------ Encoding ------ %

% Get the string for a chartoken.
% Note that this string may be overwritten by the next call.
/chartoken_string {	% <chartoken> chartoken_string <string>
  dup type Type1encode exch get exec
} bind def
% Compute the length of a CharString.
/chartoken_length {	% <chartoken> chartoken_length <length>
  chartoken_string length
} bind def
/charproc_length {	% <charproc> charproc_length <length>
  0 exch { chartoken_length add } forall
} bind def
/charstack_length {	% <charstack> charstack_length <charstack> <length>
  counttomark 0 exch -1 1 { index chartoken_length add } for
} bind def

% Write a CharString to a file.  Normally this will be a NullEncode filter
% writing on a string of the correct length.
/chartoken_write {	% <file> <chartoken> chartoken_write -
  chartoken_string writestring
} bind def
/charproc_write {	% <file> <charproc> charproc_write -
  { 1 index exch chartoken_write } forall pop
} bind def
% Note that the arguments of charstack_write are backwards.
/charstack_write {	% <charstack> <file> charstack_write -
  counttomark 1 sub -1 1 { index 1 index exch chartoken_write } for
  cleartomark
} bind def

% Convert a charproc or charstack to an *un*encrypted CharString.
/charproc_string {	% <charproc> charproc_string <string>
  mark exch aload pop charstack_string
} bind def
/charstack_string {	% <charstack> charstack_string <string>
  charstack_length lenIV 0 gt {
    lenIV add string
    dup dup length lenIV sub lenIV exch getinterval	% skip lenIV
  } {
    string
  } ifelse
  /NullEncode filter
  exch 1 index counttomark 1 add 2 roll
  charstack_write closefile
%   lenIV 0 ge { 4330 exch dup .type1encrypt exch pop readonly } if
} bind def

% ------ Decoding ------ %

% Decode a CharString (unencrypted).
/charstack_read {	% <file> charstack_read <no-mark-charstack>
  { dup read not { pop exit } if
    Type1decode 1 index get dup null eq {
      pop 1 string dup 0 4 -1 roll put
    } {
      exch pop exec
    } ifelse exch
  } loop
} bind def
4  T88 |.8c 
8     |d    |4|  Ax X8! P|N                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  %!
% Copyright (C) 1997 Aladdin Enterprises.  All rights reserved
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: uninfo.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% uninfo.ps: Utilities for "printing" PostScript items, especially dictionaries
% Usage:
% (prefix-string) dict unprint

% Maximum Print-Width
/HSpwidth 80 def

% any  HScvs string
/HScvs {
% Number-Syntax
  dup type % stack: any /anytype
  dup /integertype eq 1 index /realtype eq or { pop
    16 string cvs
  }{
% Logical-Type
    dup /booleantype eq { pop
      5 string cvs
    }{
% Identifiers
      dup /nametype eq { pop
        dup length 1 add string
        dup 0 (/) putinterval
        exch 1 index 1 1 index length 1 sub getinterval cvs pop
      }{
% Strings
        dup /stringtype eq { pop
% ------- Compute Length
          2 1 index { % stack: str len item
            dup 32 lt 1 index 126 gt or { % need 4
              pop 4 add
            }{
              dup 40 eq 1 index 41 eq or 1 index 92 eq or {
                pop 2 add
              }{
                pop 1 add
              } ifelse
            } ifelse
          } forall
% ------- Allocate & Fill String
          string dup 0 (\() putinterval 1
          3 -1 roll { % outstr pos item
            dup 32 lt 1 index 126 gt or {
              dup 7 le {
                2 index 2 index (\\00) putinterval
                8 3 index 3 index 3 add 1 getinterval cvrs
              }{
                dup 63 le {
                  2 index 2 index (\\0) putinterval
                  8 3 index 3 index 2 add 2 getinterval cvrs
                }{
                  2 index 2 index (\\) putinterval
                  8 3 index 3 index 1 add 3 getinterval cvrs
                } ifelse
              } ifelse
              pop 4 add
            }{
              dup 40 eq 1 index 41 eq or 1 index 92 eq or {
                2 index 2 index (\\) putinterval
                exch 1 add exch
              } if
              2 index exch 2 index exch put
              1 add
            } ifelse 
          } forall
          1 index exch (\)) putinterval
        }{ exch pop
          dup length 1 add string
          dup 0 (-) putinterval
          exch 1 index 1 1 index length 1 sub getinterval cvs pop
          dup dup length 4 sub (-) putinterval
          0 1 index length 3 sub getinterval
        } ifelse
      } ifelse
    } ifelse
  } ifelse
} bind def

% int HSpindent - indent-spaces
/HSpindent {
  dup 0 gt {
    1 1 3 -1 roll { pop ( ) print } for
  }{
    pop
  } ifelse
} bind def

% indent array HSaprint -> Print an Array
/HSaprint {
  dup type /arraytype eq {
    ( [) print
    exch 1 add dup 1 add
    3 -1 roll { % rind pos item
      HScvs dup length % rind pos str len
      dup 3 index add HSpwidth ge {
        (\n) print
        3 index HSpindent
        3 -1 roll pop
        2 index add
        exch
      }{
        ( ) print
        2 index add 1 add 
        3 -1 roll pop
        exch
      } ifelse
      print
    } forall
    ( ]) print
    pop pop
  }{
    ( ) print
    HScvs print pop
  } ifelse
  (\n) print
} bind def

% dict HSdnames dict names (creates sorted name-strings)
/HSdnames {
% Build namelist, stack: dic
  dup length 0 eq {
    []
  }{
    [ 1 index {
        pop dup type /nametype eq {
          dup length string cvs
        }{ 
          pop
        } ifelse
      } forall
    ]
% Sort the namelist, stack: dic nam
    0 1 2 index length 2 sub { % stack: dic nam I
      2 copy get % stack: pre dic nam I nam[I]
      1 index 1 add 1 4 index length 1 sub { % stack: dic nam I nam[I] J
        3 index 1 index get % dic nam I S[I] J S[J]
        2 index 1 index gt { % swap them
           4 index 2 index 4 index put 
           4 index 4 index 2 index put
           3 1 roll
        } if
        pop pop
      } for
      pop pop
    } for
  } ifelse
} bind def

% string:prefix dict:which unprint
/unprint {
  HSdnames % pre dic nam
% compute the maximum length
  0 1 index { % pre dic nam maxlen nam[I]
    length 2 copy lt { exch } if pop
  } forall
% Print out all the items, stack: pre dic nam maxlen
  (\n) print  
  exch { % pre dic maxlen nam[I]
% no prefix yet, -> flush right
    3 index length 0 eq {
      dup length 2 index exch sub HSpindent
    }{
      3 index print (/) print
    } ifelse 
% print the name
    dup print
% prefix: fill up with blanks 
    3 index length 0 ne {
      dup length 2 index exch sub HSpindent
    } if
% now print the item itself, stack: pre dic maxlen nam[I]
    2 index 1 index cvn get dup type % stack: pre dic maxlen nam[i] item typ 
% Dict-Syntax
    dup /dicttype eq { pop % stack: pre dic maxlen nam[i] item
      ( ) print dup HScvs print
      4 index length 0 eq { % brand new prefix
        2 index string 0 1 5 index 1 sub { 1 index exch 32 put } for
        dup 4 index 4 index length sub 5 -1 roll putinterval
      }{
        4 index length 1 add 2 index length add string
        dup 0 7 index putinterval
        dup 6 index length (/) putinterval
        dup 6 index length 1 add 5 -1 roll putinterval
      } ifelse
      exch unprint
    }{
      3 -1 roll pop % tack: pre dic maxlen item typ
% Array-Syntax
      dup /arraytype eq { pop % stack: pre dic maxlen item
        3 index length dup 0 ne { 1 add } if 2 index add 
        exch HSaprint
      }{ pop
        ( ) print
        HScvs print
        (\n) print
      } ifelse
    } ifelse
  } forall
  pop pop length -1 eq { (\n) print } if
} bind def

/currentpagedevice where { % check for currentpagedevice
   /currentpagedevice get exec () exch unprint
} if
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  %    Copyright (C) 1991, 1992, 1998 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: unprot.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Disable all access checks.  This is useful for printing out
% eexec-encrypted Type 1 fonts, and similar purposes.

systemdict wcheck
 { /protdict systemdict def
 }
 { (Please restart Ghostscript with the -dWRITESYSTEMDICT switch.\n) print
   (Some access checks will remain active if you do not do this.\n) print
   flush
   /protdict userdict def
 }
ifelse

% The procedures we're about to define will go in systemdict,
% so they must be allocated in global VM.

.currentglobal true .setglobal

protdict begin
   /readonly. /readonly load def
   /executeonly. /executeonly load def
   /noaccess. /noaccess load def
   /readonly { } odef
   /readonly.. /readonly load def
   /executeonly { } odef
   /executeonly.. /executeonly load def
   /noaccess { } odef
   /noaccess.. /noaccess load def
end

% Disable the access checks.

/unprot
 { protdict begin
   /readonly /readonly.. load def
   /executeonly /executeonly.. load def
   /noaccess /noaccess.. load def
   end
 } bind def

% Re-enable the access checks.

/reprot
 { protdict begin
   /readonly /readonly. load def
   /executeonly /executeonly. load def
   /noaccess /noaccess. load def
   end
 } bind def

.setglobal
|+xH uq`     H8! @|N  | !H uA`   |x(  A 4  (  A c  8      H A xH QA  H8! @|                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1996, 1997, 1998 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewcmyk.ps,v 1.2.6.2 2002/04/02 13:57:27 mpsuzuki Exp $
% viewcmyk.ps
% Display a raw CMYK file.
% Requires the colorimage operator.
% If SCALE is defined, maps input pixels to output pixels with that scale;
% if SCALE is undefined, scales the image to fit the page.
% If BITS is defined, it is the number of bits per sample (1,2,4,8,12);
% if BITS is undefined, its default value is 1.

/viewcmyk {			% <filename> <width> viewcmyk -
  20 dict begin
  /w exch def
  /fname exch def
  /bpc /BITS where { pop BITS } { 1 } ifelse def
  /f fname (r) file def
  mark fname status pop pop pop /flen exch def cleartomark
  /h flen w bpc 4 mul mul 7 add 8 idiv idiv def
  (Dimensions: ) print [w h] == flush
		% Set up scaling.
  /SCALE where {
    pop
	% Map pixels SCALE-for-1.  Assume orthogonal transformation.
    SCALE 1 0 dtransform add abs div
    SCALE 0 1 dtransform add abs div
  } {
	% Scale the image (uniformly) to fit the page.
    clippath pathbbox pop pop translate
    pathbbox 3 -1 roll sub h div
    3 1 roll exch sub w div .min dup
  } ifelse scale
  w h bpc [1 0 0 -1 0 h] f false 4 colorimage
  showpage
  f closefile
  end
} bind def

% If the program was invoked from the command line, run it now.
[ shellarguments {
  counttomark 2 eq {
    cvi viewcmyk
  } {
    cleartomark
    (Usage: gs -- viewcmyk.ps filename.cmyk width\n) print
    ( e.g.: gs -- viewcmyk.ps my.cmyk 2550\n) print flush
  } ifelse
} {
  pop
} ifelse
H  8`H `   T`?A t8`  |dx|ex8 @K`   a P< C0Blc Аa \bؐ X! X!( $# $H bL8a 8H ـA a <8  HbTH  8   HH IT`?@ H a`   8`  H  8`  x8! p|N  |Ȑ !H;J(   ;DA 8a 8H QA bP <~ QA (L| @A bD8  
c 	|v|֐Dzx|4|  @ |#x8b<|48 ,c  |dc8a 8H A  <T|QAL|TbpKű`   H(   A 8a 8H šA A <;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %    Copyright (C) 1989, 1992, 1993, 1998 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewgif.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% viewgif.ps
% Display a GIF file.

/read1			% <file> read1 <int>
 { read pop
 } bind def
/read2			% <file> read2 <int>
 { dup read1 exch read1 8 bitshift add
 } bind def

/readGIFheader		% <file> readGIFheader <dict>
 { 20 dict begin
   dup 6 string readstring pop
   dup (GIF87a) eq exch (GIF89a) eq or not
    { (Not a GIF file.\n) print cleartomark stop
    } if
   dup read2 /Width exch def
   dup read2 /Height exch def
   dup read1
   dup 128 ge /GlobalColor exch def
   dup -4 bitshift 7 and 1 add /BitsPerPixel exch def	%***BOGUS?***
   dup 8 and 0 ne /PaletteSorted exch def
   7 and 1 add dup /BitsPerPixel exch def
     1 exch bitshift /PaletteSize exch def
   dup read1 /BackgroundIndex exch def
   dup read1 15 add 64 div /AspectRatio exch def
   GlobalColor
    { PaletteSize 3 mul string readstring pop
      /GlobalPalette exch def
    } if
   currentdict end
 } bind def

/readGIFimageHeader	% <file> readGIFimageHeader <dict>
			% Note: GIF header must be on dict stack
 { 10 dict begin
    { dup read1
      dup (!) 0 get ne { exit } if pop		% extension
      dup read1 pop
       { dup read1 dup 0 eq { pop exit } if { dup read1 pop } repeat
       } loop
    } loop
   (,) 0 get ne
    { (Not a GIF image.\n) print stop
    } if
   dup read2 /Left exch def
   dup read2 /Top exch def
   dup read2 /Width exch def
   dup read2 /Height exch def
   dup read1
   dup 128 ge /LocalColor exch def
   dup 64 and 0 ne /Interlaced exch def
   LocalColor
    { 7 and 1 add /BitsPerPixel exch def
      1 BitsPerPixel bitshift 3 mul string readstring pop
      /Palette exch def
    }
    { pop pop /Palette GlobalPalette def
    }
   ifelse
   currentdict end
 } bind def

/imageGIF		% <imagedict> imageGIF
 { /ImageOut where
    { pop
		% We know BitsPerComponent = 8, Decode = [0 255].
		% and there is only a single data source which is
		% either a filter or a string whose size is exactly
		% the width of the row.
      dup /DataSource get dup type /stringtype eq
       { ImageOut exch writestring
       }
       { pop dup /Width get string
	 1 index /Height get
	  { 1 index /DataSource get 1 index readstring pop
	    ImageOut exch writestring
	  }
	 repeat pop pop
       }
      ifelse 
    }
    { image
    }
   ifelse
 } bind def

/viewGIF		% <file|string> viewGIF -
 { save 20 dict begin
   /saved exch def
   dup type /stringtype eq { (r) file } if
   /F exch def
   /ImageOutFile where { /ImageOut ImageOutFile (w) file def } if
   F readGIFheader /Header exch def
     currentdict Header end begin begin
   DEBUG { Header { exch == == } forall (----------------\n) print flush } if
   F readGIFimageHeader /ImageHeader exch def
     currentdict ImageHeader end begin begin
   DEBUG { ImageHeader { exch == == } forall (----------------\n) print flush } if
   /D F
   <<	/InitialCodeLength F read1
	/FirstBitLowOrder true
	/BlockData true
	/EarlyChange 0
   >> /LZWDecode filter def

   [/Indexed /DeviceRGB 1 BitsPerPixel bitshift 1 sub Palette] setcolorspace
   matrix currentmatrix
   0 1 3 { 2 copy get dup 0 ne { dup abs div } if 3 copy put pop pop } for
   setmatrix
   <<	/ImageType 1
	/ImageMatrix [1 0 0 -1 0 Height]
	/BitsPerComponent 8
	/Decode [0 255]
   Interlaced
    {	/Width Width   /Height 1
	/row Width string def
	/DataSource row
      >> /I exch def
      /inter		% <num> <denom> inter -
       { /denom exch def   /num exch def
         gsave
	 /lines Height denom 1 sub add num sub denom idiv def
	 0 1 lines 1 sub {
	   Height exch denom mul num add sub
	   I /ImageMatrix get 5 3 -1 roll put
	   D row readstring pop pop
	   I imageGIF
	 } for
	 grestore
       }
      bind def
      0 8 inter
      4 8 inter
      2 4 inter
      1 2 inter
    }
    {	/Width Width   /Height Height
	/DataSource D
      >> imageGIF
    }
   ifelse
   saved end end end restore
 } bind def   
 !|}x;  (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   %! viewjpeg.ps   Copyright (C) 1994 Thomas Merz <tm@pdflib.com>
%
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewjpeg.ps,v 1.1.6.2 2002/02/22 19:45:55 ray Exp $
% View JPEG files with Ghostscript
%
% This PostScript code relies on level 2 features.
%
% Only JPEG baseline, extended sequential, and progressive files
% are supported.  Note that Adobe PostScript level 2 does not include
% progressive-JPEG support.  Ghostscript with IJG JPEG v6 or later
% will decode progressive JPEG, but only if you edit gsjmorec.h to
% enable that feature.
%
% Updated by L. Peter Deutsch 20-May-1997:
%   move the usage example to the beginning
% Updates by Tom Lane 6-Sep-1995

% Usage example:
%	(jpeg-6/testimg.jpg) viewJPEG

/languagelevel where {pop languagelevel 2 lt}{true} ifelse {
  (JPEG needs PostScript Level 2!\n) print flush stop
} if

/JPEGdict 20 dict def
JPEGdict begin

/NoParamMarkers [	% JPEG markers without additional parameters
    16#D0 16#D1 16#D2 16#D3 16#D4 16#D5 16#D6 16#D7 16#D8 16#01
] def

/NotSupportedMarkers [ 	% JPEG markers not supported by PostScript level 2
    16#C3 16#C5 16#C6 16#C7 16#C8 16#C9 16#CA 16#CB 16#CD 16#CE 16#CF
] def

% Names of color spaces
/ColorSpaceNames << /1 /DeviceGray /3 /DeviceRGB /4 /DeviceCMYK >> def

% read one byte from file F
% - ==> int --or-- stop context
/NextByte { 
    F read not { (Read error in ViewJPEG!\n) print flush stop } if
} bind def

/SkipSegment {	% read two bytes and skip that much data
    NextByte 8 bitshift NextByte add 2 sub { NextByte pop } repeat
} bind def

% read width, height, and # of components from JPEG markers
% and store in dict
/readJPEGmarkers {	% - ==> dict --or-- stop context
    5 dict begin

    { % loop: read JPEG marker segments until we find SOFn marker or EOF
	NextByte
	16#FF eq {				% found marker
	    /markertype NextByte def
	    % Is it S0F0=baseline, SOF1=extended sequential, SOF2=progressive ?
	    markertype dup 16#C0 ge exch 16#C2 le and {
		NextByte pop NextByte pop	% segment length
		% Ghostscript and Adobe PS accept only data precision 8
		NextByte 8 ne {
		    (Error: not 8 bits per component!\n) print flush stop 
		} if

		% Read crucial image parameters
		/height NextByte 8 bitshift NextByte add def
		/width NextByte 8 bitshift NextByte add def
		/colors NextByte def

		DEBUG { currentdict { exch == == } forall flush } if
		exit
	    } if

	    % detect several segment types which are not compatible with PS
	    NotSupportedMarkers {
		markertype eq {
		    (Marker ) print markertype == 
		    (not supported!\n) print flush stop
		} if 
	    } forall 

	    % Skip segment if marker has parameters associated with it
	    true NoParamMarkers { markertype eq {pop false exit} if } forall 
	    { SkipSegment } if
	} if
    } loop

    currentdict dup /markertype undef
    end
} bind def

end	% JPEGdict

% read image parameters from JPEG file and display the image
/viewJPEG {		% <file|string> ==> -
    save 
    JPEGdict begin
    /saved exch def
    /scratch 1 string def
    dup type /stringtype eq { (r) file } if
    /F exch def

    readJPEGmarkers begin
    F 0 setfileposition		% reset file pointer

    % We use the whole clipping area for the image (at least in one dimension)
    gsave clippath pathbbox grestore
    /ury exch def /urx exch def
    /lly exch def /llx exch def

    llx lly translate
    width height scale

    % use whole width or height, whichever is appropriate
    urx llx sub width div ury lly sub height div
    2 copy gt { exch } if pop		% min
    dup scale
    ColorSpaceNames colors scratch cvs get setcolorspace

    % prepare image dictionary
    << /ImageType 1
       /Width width
       /Height height
       /ImageMatrix [ width 0 0 height neg 0 height ]
       /BitsPerComponent 8
       % If 4-component (CMYK), assume data is inverted per Adobe Photoshop
       colors 4 eq {
         /Decode [ colors { 1 0 } repeat ]
       } {
         /Decode [ colors { 0 1 } repeat ]
       } ifelse
       /DataSource F /DCTDecode filter
    >> image

    end		% image parameter dictionary

    saved end restore
} bind def
"|  A 4x8 H !A x8 H A x8 H A x8 H A |   <,   @ ,xH 5A |`4,  A x8 H A  (  A x8  H A  X8! P|N  |a !||x|#x|+x8L8     |   e  |  e       (  A d8bT :|c .|iN   @H  L| 
8 @H A |x4,  @ ,H A a @H  H }A a @H  8`  H   ,  @ \4,  A PH MA |{xH `   T`?A 4cxH A |`4,  @  @| @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1998 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewmiff.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% viewmiff.ps
% Display a MIFF file.  You would think the 'display' command would do this,
% but many versions of 'display' either core-dump or require unacceptably
% large amounts of memory.

% Recognize MIFF keywords.
/miffwords mark
  /class { cvn /class exch def }
  /colors { cvi /colors exch def }
  /columns { cvi /Width exch def }
  /compression { cvn /compression exch def }
  /depth { cvi /depth exch def }
  /packets { cvi /packets exch def }
  /rows { cvi /Height exch def }
.dicttomark readonly def

% Recognize MIFF image classes.
/miffclasses mark
  /DirectClass {
    /DeviceRGB setcolorspace
    /BitsPerComponent depth def
    /Decode [ 0 1 0 1 0 1 ] def
  }
  /PseudoClass {
    [ /Indexed
		% The MIFF documentation lies about the size of pixels
		% for this case: the pixel size is determined only by
		% the number of colors, and is not affected by the image
		% depth.  Specifically, if there are 256 or fewer colors
		% but the depth (of color map entries) is 16, each pixel
		% is still only 1 byte, not 2.
      currentdict /colors known {
	/DeviceRGB colors 1 sub
	/BitsPerComponent colors 256 le { 8 } { 16 } ifelse def
	colors 3 mul string depth 8 eq {
	  f exch readstring pop
	} {
		% 16-bit color map entries: take only the high-order byte.
	  0 1 2 index length 1 sub {
	    f read pop 2 index 3 1 roll put f read pop pop
	  } for
	} ifelse
      } {
	/colors 256 def
	/DeviceGray 255
	256 string 0 1 255 { 1 index exch dup put } for
      } ifelse
    ] setcolorspace
    /Decode [ 0 1 BitsPerComponent bitshift 1 sub ] def
  }
.dicttomark readonly def

% Recognize MIFF compression methods.
/rlstring 768 string def
/rlread {
		% packets is not reliable -- disregard it.
  dup rlstring 0 3 getinterval readstring {
    pop read pop 3 mul 3 3 2 index {
      rlstring exch rlstring 0 3 getinterval putinterval
    } for
    rlstring 0 3 -1 roll 3 add getinterval
  } {
    pop pop ()
  } ifelse
} bind def
/miffcompress mark
  /Uncompressed { f }
  /RunLengthEncoded { { f rlread } }
  /Zip { [ f /FlateDecode filter cvlit /rlread cvx ] cvx }
.dicttomark readonly def

% Read a MIFF file and display the image.
/viewmiff {		% <filename> viewmiff -
  50 dict begin
  /fname 1 index def
  /f exch (r) file def
		% Set defaults.
  /ImageType 1 def
  /class /DirectClass def
  /compression /Uncompressed def
  /depth 8 def
  /packets 16#7fffffff def
		% Read and parse the header.
  { f token pop
    dup (:) eq { pop exit } if
    dup type /nametype eq {
      .namestring (=) search {
	exch pop miffwords exch .knownget { exec } { pop } ifelse
      } {
	pop	% who knows?
      } ifelse
    } {
      pop	% probably a comment in braces
    } ifelse
  } loop
		% Read and display the image.
  miffclasses class get exec
  /DataSource miffcompress compression get exec def
  /ImageMatrix [Width 0 0 Height neg 0 Height] def
  currentpagedevice /PageSize get
    dup 0 get exch 1 get scale
  gsave 0.8 setgray 0 0 1 1 rectfill grestore	% provide background
  currentdict image
  showpage
		% Clean up.
  f closefile
  end
} bind def
H  P8` H iaA 8` 	H imA 8` H iyA H  (8` H i9A 8` 	H iEA 8` H iQA  H8! @|N  | !|}x |(  A xH f5A |xH  ;  ;  xH eA 8a |H oA  (  A  |xH xɀA T`?@ ; H  xx8 D8 @8 8H dA 4 L` (|,  @ 08 } .(  A   |%    Copyright (C) 1992, 1995, 1996, 1998, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewpbm.ps,v 1.2.6.2 2002/04/02 13:57:27 mpsuzuki Exp $
% viewpbm.ps
% Display a PBM/PGM/PPM file.
% Requires the Level 2 `image' operator (to handle variable pixel widths).
% If SCALE is defined, maps input pixels to output pixels with that scale;
% if SCALE is undefined, scales the image to fit the page.

/s 100 string def
/readmaxv {		% <file> readmaxv -
  10 string readline pop cvx exec /maxv exch def
} bind def
/readrow {		% <file> <row> readrow <row>
  0 1 2 index length 1 sub {
    1 index exch 3 index token pop put
  } for exch pop
} bind def
/read01 {		% <file> <count> read01 <byte>
  0 exch {
    1 index read pop 48 xor dup 1 le { exch dup add add } { pop } ifelse
  } repeat
} bind def
/readrow01 {		% <file> <row> readrow01 <row>
  0 1 w 8 idiv {
    1 index exch 3 index 8 read01 put
  } for
  wrem 0 ne {
     dup rsize 1 sub wrem read01 8 wrem sub bitshift put
  } if
  exch pop
} bind def
/readwh {		% <file> readwh <w> <h>
 dup s readline pop		% check for comment
 (#) anchorsearch {
   pop pop dup s readline pop
 } if
 cvx exec
} bind def
/pbmtypes mark
% The procedures in this dictionary are called as
%	<file> Pn <w> <h> <readproc>
/P1 {			% ASCII 1-bit white/black
  /bpc 1 def /maxv 1 def /rsize w 7 add 8 idiv def
  /wrem w 8 mod def
  /ncomp 1 def /invert true def /DeviceGray setcolorspace
  readwh
	{ readrow01 }
} bind
/P2 {			% ASCII 8-bit gray
  readwh
  /bpc 8 def 2 index readmaxv /rsize 2 index def
  /ncomp 1 def /invert false def /DeviceGray setcolorspace
	{ readrow }
} bind
/P3 {			% ASCII 8-bit RGB
  readwh
  /bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
  /ncomp 3 def /invert false def /DeviceRGB setcolorspace
	{ readrow }
} bind
/P4 {			% Binary 1-bit white/black
  readwh
  /bpc 1 def /maxv 1 def /rsize 2 index 7 add 8 idiv def
  /ncomp 1 def /invert true def /DeviceGray setcolorspace
	{ readstring pop }
} bind
/P5 {			% Binary 8-bit gray
  readwh
  /bpc 8 def 2 index readmaxv /rsize 2 index def
  /ncomp 1 def /invert false def /DeviceGray setcolorspace
	{ readstring pop }
} bind
/P6 {			% Binary 8-bit RGB
  readwh
  /bpc 8 def 2 index readmaxv /rsize 2 index 3 mul def
  /ncomp 3 def /invert false def /DeviceRGB setcolorspace
	{ readstring pop }
} bind
.dicttomark readonly def
/pbmsetup {			% <file> <w> <h> <readproc> runpbm -
   /readproc exch def
   /h exch def
   /w exch def
   /f exch def
   20 dict begin		% image dictionary
     /ImageType 1 def
     /Width w def
     /Height h def
     /ImageMatrix [w 0 0 h neg 0 h] def
     /BitsPerComponent bpc def
     /Decode [ 0 255 maxv div invert { exch } if ncomp 1 sub { 2 copy } repeat ] def
     /DataSource [ f rsize string /readproc load /exec load ] cvx def
   currentdict end
} def
/imagescale {			% <imagedict> imagescale -
  begin
    /SCALE where {
      pop
	% Map pixels SCALE-for-1.  Assume orthogonal transformation.
      Width 1 0 dtransform add abs div SCALE mul
      Height 0 1 dtransform add abs div SCALE mul
    } {
	% Scale the image (uniformly) to fit the page.
      clippath pathbbox pop pop translate
      pathbbox .min exch pop exch pop ceiling
      dup Height Width gt {
	Width mul Height div exch
      } {
	Height mul Width div
      } ifelse
    }
    ifelse scale
  end
} def

% Image a PBM file page by page.
/viewpbm {			% <filename> viewpbm -
  20 dict begin
    (r) file /pf exch def {
      pf token not { exit } if
      pbmtypes exch get pf exch exec pbmsetup
      dup imagescale image showpage
    } loop
  end
} def

% Reassemble a composite PBM file from the CMYK separations.
/viewpsm {
  20 dict begin
    /fname exch def
    /sources [ 0 1 3 {
      /plane exch def 
      /pf fname (r) file def
      pf pbmtypes pf token pop get exec
		% Stack: pf w h readproc
      plane {
	/readproc exch def /h exch def /w exch def pop
	/row rsize string def
	h { pf row readproc pop } repeat
	pf pbmtypes pf token pop get exec
      } repeat
      pbmsetup
    } for ] def
    /datas [ sources { /DataSource get 0 get } forall ] def
    /decode sources 0 get /Decode get
      dup 0 get exch 1 get add cvi 0 exch
      2 copy 4 copy 8 array astore def
    sources 0 get
      dup /MultipleDataSources true put
      dup /DataSource datas put
      dup /Decode decode put
    /DeviceCMYK setcolorspace
    dup imagescale image showpage
  end
} def

% If the program was invoked from the command line, run it now.
[ shellarguments
 { counttomark 1 ge
    { ] { viewpbm } forall
    }
    { cleartomark
      (Usage: gs [--] viewpbm.ps filename.p*m ...\n) print
      ( e.g.: gs [--] viewpbm.ps my.ppm another.ppm\n) print flush
    }
   ifelse
 }
 { pop
 }
ifelse
\H Y`   |`4,  @H I]A W?@  xH JA 8` #H JA H  xH JA 8` !H JA 8b
H JA W?~ @ 8 H  8  | PH J
A ~   H JA ~   8c H IA W?@ 8` H  8`    |c PH IـA W>(  @  xH IA 8` #H IA H  xH IՀA 8` !H IA ~ W?  8c@ 8  H  8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   %    Copyright (C) 1996, 1999 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewpcx.ps,v 1.2.6.2 2002/04/02 13:57:27 mpsuzuki Exp $
% viewpcx.ps
% Display a PCX file.
% Requires the Level 2 `image' operator (to handle variable pixel widths).
% If SCALE is defined, maps input pixels to output pixels with that scale;
% if SCALE is undefined, scales the image to fit the page.
% ****NOTE: does not handle multi-plane images with palette.

/pcxbytes [
  0 1 255 {
    64 string exch 0 1 63 {
      3 copy exch put pop
    } for pop
  } for
] readonly def
/readpcx {			% - readpcx <str>
  f				% gets replaced
  dup read not {
    pop ()
  } {
    dup 192 lt {
      ( ) dup 0 4 -1 roll put exch pop
    } {
      192 sub //pcxbytes 3 -1 roll read pop get exch 0 exch getinterval
    } ifelse
  } ifelse
} def
/get2				% <string> <index> get2 <int>
 { 2 copy get 3 1 roll 1 add get 8 bitshift add
 } bind def
/dsproc
 { df s readstring pop		% s gets filled in
   s1 () ne { df s1 readstring pop pop } if % discard padding bytes
 } def				% don't bind, must be writable
/viewpcx			% <filename> viewpcx -
 { 100 dict begin
   /fname 1 index def
   /f exch (r) file def
		% Read and unpack the header.
   /header f 128 string readstring pop def
   /version header 1 get def
   /bpp header 3 get def
   /w header 8 get2 header 4 get2 sub 1 add def
   /h header 10 get2 header 6 get2 sub 1 add def
   /nplanes header 65 get def
   /bpl header 66 get2 def
   /palinfo header 68 get2 def
   /nbits bpp nplanes mul def
   version 5 eq
    { nbits 8 le
       { /cspace
	   [/Indexed   /DeviceRGB   1 bpp bitshift 1 sub
	 f fileposition
	 1 nbits bitshift 3 mul string
	 fname status pop pop pop exch pop
	 1 index length sub f exch setfileposition
	 f exch readstring pop
	 exch f exch setfileposition
	   ] def
	 /decode [0 cspace 2 get] def
       }
       { /cspace /DeviceRGB def
	 /decode [0 1 0 1 0 1] def
       }
      ifelse
    }
    { /cspace
	[/Indexed   /DeviceRGB   1 bpp bitshift 1 sub
	 header 16 1 nbits bitshift 16 .min 3 mul getinterval
	] def
      /decode [0 cspace 2 get] def
    }
   ifelse
		% Set up scaling.
   /SCALE where
    { pop
	% Map pixels SCALE-for-1.  Assume orthogonal transformation.
      w 1 0 dtransform add abs div SCALE mul
      h 0 1 dtransform add abs div SCALE mul
    }
    {	% Scale the image (uniformly) to fit the page.
      clippath pathbbox pop pop translate
      pathbbox .min exch pop exch pop ceiling
      dup h w gt { w mul h div exch } { h mul w div } ifelse
    }
   ifelse scale
		% Since the number of bytes per line is always even,
		% it may not match the width specification.
   /wbpl w bpp mul 7 add 8 idiv def
		% Define the data source procedure.
   /s1 bpl wbpl sub string def
   /df /readpcx load copyarray dup 0 f put cvx bind readonly
     0 () /SubFileDecode filter def
   /dsource [ nplanes
    { /dsproc load copyarray
      dup 1 wbpl string put
      cvx bind readonly
    }
   repeat ] def
		% Construct the image dictionary.
   20 dict begin		% image dictionary
     /ImageType 1 def
     /Width w def
     /Height h def
     /ImageMatrix [w 0 0 h neg 0 h] def
     /BitsPerComponent bpp def
     /Decode decode def
     /DataSource dsource dup length 1 gt
      { /MultipleDataSources true def }
      { 0 get }
     ifelse def
   currentdict end
		% Finally, display the image.
   cspace setcolorspace
   image
   showpage
   df closefile
   f closefile
   end
 } bind def

% If the program was invoked from the command line, run it now.
[ shellarguments
 { counttomark 1 ge
    { ] { viewpcx } forall
    }
    { cleartomark
      (Usage: gs -- viewpcx.ps filename.pcx ...\n) print
      ( e.g.: gs -- viewpcx.ps my.pcx another.pcx\n) print flush
    }
   ifelse
 }
 { pop
 }
ifelse
x 8H .
A 8a 8H 8QA  z : 8H /̀A  zH 0A  : 8 z| | H /A  X8! P|N  | !|x8a 8H 1iA 4|p8a 8|c T~|`0T X8! P|N  | !|#x|+x8 8H 3A a 88  c   4H  @                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1995 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: viewps2a.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% Display a file produced by ps2ascii with no switch or with -dCOMPLEX.
% This is just a procset to read in before the file to display.

/init { 0.1 0.1 scale } bind def
init
/next { currentfile token pop } bind def
/F { next next pop next exch selectfont } bind def
/P { showpage init } bind def
/S
 { next next moveto
   next dup stringwidth pop next exch div
   gsave 1 scale show grestore
 } bind def
/C { next next next setrgbcolor } bind def
/I { next next next next gsave 0.75 setgray rectfill grestore } bind def
/R { next next next next rectfill } bind def
A 8` H !YA  cx8 XK|`    cx8 HK|`   8 |#x8a HH  ]A a Z8 Za ^8 ^ Z |4|  A܀a H La P T L(   A0W?A( |  @  R8~ N VH !A a V P8cH !A a R PH !A a R J|d4|  @ 0 T                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %    Copyright (C) 1995, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: wftopfa.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% wftopfa.ps
% Convert a Wadalab base font to .PFA (or .PFB) format.

(gs_ksb_e.ps) runlibfile
(wrfont.ps) runlibfile

/wftopfa_dict 100 dict def
wftopfa_dict begin

/KanjiSubEncoding dup .findencoding def

% Initialize parameters.
/init			% - init -
 { /chars 256 dict def
   /version (001.001) def
   /highcode 0 def
   /StdHW [32] def
   /StdVW [32] def
   /UniqueID 20000000 def
   /FontBase (Wadalab) def
   /StdEncMode false def
   /CustomEncMode false def
   /Binary false def
   /Encrypt true def
 } bind def

% Read definitions.
/rdstring 5000 string def
/readdefs		% <filename> readdefs -
 { (r) file
    { dup rdstring readline not { pop exit } if
      dup length 15 ge
       { dup dup length 7 sub 7 getinterval (> CompD) eq
	  { token pop exch token pop exch pop
	    dup 0 get /highcode exch def
	    exch chars 3 1 roll put
	  }
	  { pop
	  }
	 ifelse
       }
       { pop
       }
      ifelse
    }
   loop closefile
 } bind def

% Write out the final font.
/writepfa
 { 4 string highcode 16#1000 add 16 2 index cvrs 0 (.r) putinterval
     FontBase exch concatstrings /fullname exch def
   UniqueID 20000000 eq { /UniqueID 4990000 highcode add def } if
   /encoding CustomEncMode
    { KanjiSubEncoding }
    { StdEncMode { StandardEncoding } { ISOLatin1Encoding } ifelse }
   ifelse def

   /Font 30 dict def
   Font begin
   /FontInfo 20 dict def
   FontInfo begin

		% Write the clear text part.

   /CreationDate (%Calendar%) currentdevparams
     dup /Weekday get {(Sun )(Mon )(Tue )(Wed )(Thu )(Fri )(Sat )} exch get
     1 index /Month get 1 sub
       {(Jan)(Feb)(Mar)(Apr)(May)(Jun)(Jul)(Aug)(Sep)(Oct)(Nov)(Dec)} exch get
     concatstrings
      {{/Day ( )} {/Hour ( )} {/Minute (:)} {/Second (:)} {/Year ( )}}
      { dup 1 get 3 -1 roll exch concatstrings exch
        0 get 2 index exch get
        dup 10 lt { =string cvs (0) exch concatstrings } { =string cvs } ifelse
        concatstrings
      }
     forall exch pop readonly def
   /VMusage 100000 def
   /version version readonly def
   /Notice (No copyright on this font. Original available from moe.ipl.t.u-tokyo.ac.jp:/Font. Converted by wftopfa.ps (Aladdin Enterprises).) readonly def
   /FullName fullname readonly def
   /FamilyName FontBase readonly def
   /Weight (Regular) readonly def
   /ItalicAngle 0 def
   /isFixedPitch true def
   /UnderlinePosition 0 def
   /UnderlineThickness 0 def

   end			% FontInfo

   /FontName fullname cvn def
   /Encoding encoding def
   /PaintType 0 def
   /FontType 1 def
   /FontMatrix [.001 0 0 .001 0 -0.16] readonly def
   /UniqueID UniqueID def
   /FontBBox [0 0 1000 1000] readonly def

   /Private 20 dict def
   Private begin

   /-| {string currentfile exch readstring pop} readonly def
   /|- {readonly def} readonly def
   /| {readonly put} readonly def
   /BlueValues [] readonly def
   /OtherBlues [] readonly def
   /MinFeature {16 16} readonly def
   /StdHW StdHW def
   /StdVW StdVW def
   /ForceBold false def
   /password 5839 def
   /UniqueID UniqueID def
   /OtherSubrs [] readonly def
   /Subrs [
     (\020\2771p|\020\024\020=-\223D\\\342R) readonly
     (\020\2771py\274\366Uz) readonly
     (\020\2771py\275\304\236i) readonly
     (\020\2771p\371) readonly
     (\020\2771p~\266+6\034\3446z) readonly
   ] readonly def

   end			% Private

   /CharStrings 256 dict def
   chars
    { exch =string cvs
      dup 0 get highcode eq
       { 1 get encoding exch get exch CharStrings 3 1 roll put }
       { pop pop }
      ifelse
    }
   forall

   end			% Font

   Font /FontName get Font definefont setfont
   (%stdout) (w) file writefont
 } bind def

% Scan the command line and process files.
/options mark
  /version { 2 copy get /version exch def 1 add } bind
  /StdHW { 2 copy get cvx exec /StdHW exch def 1 add } bind
  /StdVW { 2 copy get cvx exec /StdVW exch def 1 add } bind
  /UniqueId { 2 copy get cvi /UniqueID exch def 1 add } bind
  /UniqueID 1 index
  /FontBase { 2 copy get /FontBase exch def 1 add } bind
  /StdEnc { /StdEncMode true def } bind
  /CustomEnc { /CustomEncMode true def } bind
  /Binary { /Binary true def } bind
  /noEncrypt { /Encrypt false def } bind
.dicttomark def
/wftopfa		% [(arg1) ...] wftopfa -
 { init dup 0
    { dup 2 index length ge { exit } if
      2 copy get exch 1 add exch
      options 1 index .knownget { exch pop exec } { readdefs } ifelse
    }
   loop pop pop
   wrfont_dict /binary_CharStrings Binary put
   wrfont_dict /eexec_encrypt Encrypt put
   wrfont_dict /name_all_Encodings CustomEncMode put
   writepfa
 } bind def

end				% wftopfa_dict

/wftopfa
 { mark exch wftopfa_dict begin /saved save def { wftopfa } exec false%stopped
    { cleartomark true } { cleartomark false } ifelse
   saved end restore { stop } if
 } bind def

[ shellarguments
 { ] wftopfa }
 { pop }
ifelse

% ---------------- Root font ---------------- %

% Define the Encoding for the root font.
/wfrootencoding
% \x00-\x3F
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
  0  1  2  3  4  5  6  7  8  0  0  0  0  0  0  0
  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
% \x40-\x7F
 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
 73 74 75 76 77  0  0  0  0  0  0  0  0  0  0  0
% \x80-\xFF
128 copy
256 packedarray def

% Define the template for the root font dictionary.
/wfrootfontdict mark
  /FontType 0
  /FontMatrix [1 0 0 1 0 0]
  /FMapType 2
  /Encoding wfrootencoding
.dicttomark def

% Define a dummy (placeholder) Type 1 font for the FDepVector.
/type1dummyfont		% <fontname> type1dummyfont <font>
 { mark /FontName 3 -1 roll
   /FontType 1
   /FontMatrix [.001 0 0 .001 0 0]
   /FontBBox [0 0 1000 1000]
   /Encoding /KanjiSubEncoding findencoding
   /CharStrings 0 dict
   /Private mark /BlueValues [] /password 5839 .dicttomark
   .dicttomark dup /FontName get exch definefont
 } bind def

% Write a root font.  Again, wrfont.ps does most of the work.
/makerootfont		% <rootname> makerootfont <font>
 { wfrootfontdict dup length 4 add	% FontName, FDepVector, PrefEnc, FID
   dict copy begin
   cvlit /FontName exch def
   4 dict begin
   /len FontName length def
   /str len 4 add string def
   FontName str cvs pop
   str len (.r) putinterval
   /FDepVector [ 16#21 1 16#74
    { dup wfrootencoding exch get 0 eq
       { pop
       }
       { 16 str len 2 add 2 getinterval cvrs pop
         str cvn type1dummyfont
       }
      ifelse
    }
   for end counttomark -1 roll dup counttomark 2 roll
   ] def
   FontName currentdict end definefont
 } bind def
/writerootfont		% <rootname> writerootfont -
 { save exch makerootfont setfont (%stdout) (w) file writefont restore
 } bind def

% ---------------- Converting entire fonts ---------------- %

% Define the directory where the Wadalab fonts are stored.
/wfdir (/home/ghost/kanji/w) def

% Convert an entire Wadalab font.
/writeentirefont	% <fontname> <template*> writeentirefont -
 { 2 dict begin
   /templates exch def
   /fontname exch def
   [ templates
      { wfdir (/) concatstrings exch concatstrings { copystring }
	100 string filenameforall
      }
     forall
     wfdir (/wadalab-sym/*.ps) concatstrings { copystring }
       100 string filenameforall
   ]
   (%!\n) print
    { /currentuserparams where
       { pop currentuserparams /VMReclaim get -2 vmreclaim { vmreclaim } }
       { { } }
      ifelse
    } == (exec\n) print
   (/KanjiSubEncoding ) print /KanjiSubEncoding findencoding ==
     (readonly def\n) print
    { (%stderr) (w) file dup 2 index write== flushfile
       mark exch (CustomEnc) (Binary) (noEncrypt)
       (FontBase) fontname counttomark -1 roll ] wftopfa
    }
   forall
   fontname cvn writerootfont
   (exec\n) print
   end
 } def			% don't bind, so we can print the procedure

% Convert the Wadalab JIS 1&2 SaiMincho font.
% To invoke this from the command line,
%	gs -dNODISPLAY -q wftopfa.ps -c writeSaiMincho0 flush quit >wmin0.ps
% To make the resulting font loadable on demand, add to the Fontmap file:
%	/Wadalab-SaiMincho (wmin0.ps) ;
/writeSaiMincho0
 { (Wadalab-SaiMincho) [ (wadalab-mincho-0-8/*.ps) ] writeentirefont
 } bind def
|	N A   L |	N A   L |	N A   L |	N  A   L |	N A   L |	N lA   L |	N A   L |	N ,A   L |	N A   L |	N A   L |	N A   L |	N tA   L                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 %    Copyright (C) 1993 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: winmaps.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% winmaps.ps - make maps between PostScript encodings and Windows
% character sets.

% Define the two Windows encodings.

/ANSIEncoding
  ISOLatin1Encoding 256 array copy
  dup 16#90 /.notdef put
  16#93 1 16#9f { 2 copy /.notdef put pop } for
def

/OEMEncoding [
  /.notdef /.notdef /.notdef /heart /diamond /club /spade /bullet
    8 { /.notdef } repeat
  /.notdef /.notdef /.notdef /.notdef /paragraph /section /.notdef /.notdef
    /arrowup /arrowdown /arrowright /arrowleft /.notdef /arrowboth /.notdef /.notdef
  StandardEncoding 32 96 getinterval aload pop
  /Ccedilla /udieresis /eacute /acircumflex /adieresis /agrave /aring /ccedilla
    /ecircumflex /edieresis /egrave /idieresis /igrave /Adieresis /Aring
  /Eacute /ae /AE /ocircumflex /odieresis /ograve /ucircumflex /ugrave
    /ydieresis /Odieresis /Udieresis /cent /sterling /yen /.notdef /florin
  /aacute /iacute /oacute /uacute /ntilde /Ntilde /ordfeminine /ordmasculine
    /questiondown /.notdef /logicalnot /onehalf /onequarter /exclamdown /guillemotleft /guillemotright
  48 { /.notdef } repeat
  /alpha /beta /Gamma /Pi /Sigma /sigma /mu /tau
    /Phi /Theta /Omega /delta /infinity /phi /element /intersection
  /equivalence /plusminus /greaterequal /lessequal /integraltp /integralbt /divide /.notdef
    /degree /dotmath /periodcentered /radical /.notdef /twosuperior /.notdef /.notdef
] def

% Utility procedures

/invertencoding		% <array> invertencoding <dict>
 { 256 dict exch dup length 1 sub -1 0
    {	% stack: dict array index
      2 copy get /.notdef ne
       { 2 copy get exch 3 index 3 1 roll put }
       { pop }
      ifelse
    } for
   pop
 } def

/pmarray 256 array def
/printmap		% <chars> <decode> printmap -
 { mark 3 1 roll exch
    { 2 copy known { 1 index exch get } { pop 0 } ifelse exch
    }
   forall pop
   pmarray 0 counttomark 2 sub getinterval astore
   ([) print dup length =only 0 exch (] = {\n  ) exch
    { exch print =only
      1 add 15 and dup 0 eq { (,\n  ) } { (, ) } ifelse
    }
   forall pop pop (\n};\n) print pop
 } def

/decodeStd StandardEncoding invertencoding def
/decodeISO ISOLatin1Encoding
	% Remove the redundant characters
  dup length array copy
  [8#222 8#225 8#230 8#233 8#240] { 2 copy /.notdef put pop } forall
invertencoding def
/decodeSym SymbolEncoding invertencoding def

/decodeANSI ANSIEncoding invertencoding def
/decodeOEM OEMEncoding invertencoding def

% Construct the map from Symbol to OEM.

(\nprivate const byte far_data gs_map_symbol_to_oem) print
SymbolEncoding decodeOEM printmap

% Construct the map from ISOLatin1 to OEM.

(\nprivate const byte far_data gs_map_iso_to_oem) print
ISOLatin1Encoding decodeOEM printmap

% Construct the map from Standard to ISOLatin1.

(\nprivate const byte far_data gs_map_std_to_iso) print
StandardEncoding decodeISO printmap

% Construct the map from ISOLatin1 to Standard.
% The Windows driver doesn't need this, but the X11 driver does.

(\nprivate const byte far_data gs_map_iso_to_std) print
ISOLatin1Encoding decodeStd printmap

quit
pd m PHh L/* LNPORCmmN#hJ-g,YOu #RUOa0r 2 &0-H"Nr;@+mUOHmN20BN,XOL8N^NuNV  /
p"$H 
f`L R mdm1 Rp!@  Rp!@  Rpd!@  R1m  R1m  Rm  m"J< N#4 JTO$_N^NuNVH N0/<  N@/< N@/< N@7N+H/<N$H 
O fp ` Hz
:/
NHz/
NHzv/
NHz/
N/
N%    Copyright (C) 1991, 1995, 1996 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: wrfont.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% wrfont.ps
% Write out a Type 1 font in readable, reloadable form.
% Note that this does NOT work on protected fonts, such as Adobe fonts
% (unless you have loaded unprot.ps first, in which case you may be
% violating the Adobe license).

% ****** NOTE: This file must be kept consistent with gs_pfile.ps.

/wrfont_dict 100 dict def
wrfont_dict begin

% ------ Options ------ %

% Define whether to use eexec encryption for the font.
% eexec encryption is only useful for compatibility with Adobe Type Manager
% and other programs; it only slows Ghostscript down.
   /eexec_encrypt false def

% Define whether to write out the CharStrings in binary or in hex.
% Binary takes less space on the file, but isn't guaranteed portable.
   /binary_CharStrings false def

% Define whether to use binary token encodings when possible.
% Binary tokens are smaller and load faster, but are a Level 2 feature.
   /binary_tokens false def

% Define whether to encrypt the CharStrings on the file.  (CharStrings
% are always encrypted in memory.)  Unencrypted CharStrings load about
% 20% slower, but make the files compress much better for transport.
   /encrypt_CharStrings true def

% Define whether the font must provide standard PostScript language
% equivalents for any facilities it uses that are provided in Ghostscript
% but are not part of the standard PostScript language.
   /standard_only true def

% Define the value of lenIV to use in writing out the font.
% use_lenIV = 0 produces the smallest output, but this may not be
% compatible with old Adobe interpreters.  use_lenIV = -1 means
% use the value of lenIV from the font.
   /use_lenIV -1 def

% Define whether to produce the smallest possible output, relying
% as much as possible on Ghostscript-specific support code.
% Taking full advantage of this requires the following settings:
% binary_CharStrings = true, binary_tokens = true, standard_only = false.
   /smallest_output false def

% Define whether to write out all currently known Encodings by name,
% or only StandardEncoding and ISOLatin1Encoding.
   /name_all_Encodings false def

% ---------------- Runtime support ---------------- %

/.packedfilefilter where
 { pop }
 { (gs_pfile.ps) runlibfile }
ifelse

% ------ Output utilities ------ %

% By convention, the output file is named psfile.

% Define some utilities for writing the output file.
   /wtstring 2000 string def
   /wb {psfile exch write} bind def
   /wnb {/wb load repeat} bind def
   /w1 {psfile exch write} bind def
   /ws {psfile exch writestring} bind def
   /wl {ws (\n) ws} bind def
   /wt {wtstring cvs ws ( ) ws} bind def
   /wd		% Write a dictionary.
    { dup length wo {dict dup begin} wol { we } forall
      {end} wol
    } bind def
   /wld		% Write a large dictionary more efficiently.
   		% Ignore the readonly attributes.
    { dup length wo {dict dup begin} wol
      0 exch
       { exch wo wo () wl
	 1 add dup 200 eq
	  { wo ({def} repeat) wl 0 }
	 if
       }
      forall
      dup 0 ne
       { wo ({def} repeat) wl }
       { pop }
      ifelse
      (end) ws
    } bind def
   /we		% Write a dictionary entry.
    { exch wo wo /def cvx wo (\n) ws
    } bind def
   /wcs		% Write a CharString (or Subrs entry)
    { dup type /stringtype eq
       { 4330 exch changelenIV 0 ge
          {	% Add some leading garbage bytes.
	    wtstring changelenIV 2 index length getinterval
	    .type1decrypt exch pop
	    wtstring exch 0 exch length changelenIV add getinterval
	  }
	  {	% Drop some leading garbage bytes.
	    wtstring .type1decrypt exch pop
	    changelenIV neg 1 index length 1 index sub getinterval
	  }
	 ifelse
         binary_tokens encrypt_CharStrings and
	  { % Suppress recognizing the readonly status of the string.
	    4330 exch dup .type1encrypt exch pop wo
	  }
	  { encrypt_CharStrings
	     { 4330 exch dup .type1encrypt exch pop
	     } if
	    smallest_output
	     { wo
	     }
	     { readonly dup length wo
	       binary_tokens not { ( ) ws } if
	       readproc ws wx
	     }
	    ifelse
	  }
	 ifelse
       }
       { wo		% PostScript procedure
       }
      ifelse
    } bind def

% Construct the inversion of the system name table.
   /SystemNames where
    { pop /snit 256 dict def
      0 1 255
       { dup SystemNames exch get
         dup null ne { exch snit 3 1 roll put } { pop pop } ifelse
       }
      for
    }
    { /snit 1 dict def
    }
   ifelse

% Write an object, using binary tokens if requested and possible.
   /woa		% write in ascii
    { psfile exch write==only
    } bind def

			% Lookup table for ASCII output.

   /intbytes	% int nbytes -> byte*
    { { dup 255 and exch -8 bitshift } repeat pop
    } bind def
   /wotta 10 dict dup begin
      { /booleantype /integertype }
      { { ( ) ws woa } def }
     forall
		% Iterate over arrays so we can print operators.
     /arraytype
      { dup xcheck {(}) ({)} {(]) ([)} ifelse ws exch dup wol exch ws wop
      } bind def
     /dicttype
      { ( ) ws wd } def
     /nametype
      { dup xcheck { ( ) ws } if woa
      } bind def
		% Map back operators to their names,
		% so we can write procedures.
     /nulltype
      { pop ( null) ws
      } bind def
     /operatortype
      { wtstring cvs cvn cvx wo
      } bind def
		% Convert reals to integers if possible.
     /realtype
      { dup cvi 1 index eq { cvi wo } { ( ) ws woa } ifelse
      } bind def
		% == truncates strings longer than 200 characters!
     /stringtype
      { (\() ws dup
	 { dup dup 32 lt exch 127 ge or
	    { (\\) ws dup -6 bitshift 48 add w1
	      dup -3 bitshift 7 and 48 add w1
	      7 and 48 add
	    }
	    { dup dup -2 and 40 eq exch 92 eq or {(\\) ws} if
	    }
	   ifelse w1
	 }
	forall
	(\)) ws wop
      } bind def
     /packedarraytype
      { ([) ws dup { wo } forall
	encodingnames 1 index known
		% This is an encoding, but not one of the standard ones.
		% Use the built-in encoding only if it is available.
	 { encodingnames exch get wo
	   ({findencoding}stopped{pop) ws
	   (}{counttomark 1 add 1 roll cleartomark}ifelse)
	 }
	 { pop ()
	 }
	ifelse
	(/packedarray where{pop counttomark packedarray exch pop}{]readonly}ifelse) ws
	wl
      }
     def
   end def

			% Lookup table for binary output.

   /wottb 8 dict dup begin
   wotta currentdict copy pop
     /integertype
      { dup dup 127 le exch -128 ge and
         { 136 wb 255 and wb }
	 { dup dup 32767 le exch -32768 ge and
	    { 134 wb 2 intbytes wb wb }
	    { 132 wb 4 intbytes wb wb wb wb }
	   ifelse
	 }
	ifelse
      } bind def
     /nametype
      { dup snit exch known
         { dup xcheck { 146 } { 145 } ifelse wb
	   snit exch get wb
	 }
	 { wotta /nametype get exec
	 }
	ifelse
      } bind def
     /stringtype
      { dup dup length dup 255 le { 142 2 } { 2 intbytes 143 3 } ifelse wnb
	ws wop
      } bind def
   end def

   /wop		% Write object protection
     { wcheck not { /readonly cvx wo } if
     } bind def
   /wo		% Write an object.
     { dup type binary_tokens { wottb } { wotta } ifelse
       exch get exec
     } bind def
   /wol		% Write a list of objects.
     { { wo } forall
     } bind def

% Write a hex string for Subrs or CharStrings.
   /wx		% string ->
    { binary_CharStrings
       { ws
       }
       { % Some systems choke on very long lines, so
	 % we break up the hexstring into chunks of 50 characters.
	  { dup length 25 le {exit} if
	    dup 0 25 getinterval psfile exch writehexstring (\n) ws
	    dup length 25 sub 25 exch getinterval
	  } loop
	 psfile exch writehexstring
       } ifelse
    } bind def

% ------ CharString encryption utilities ------ %

/enc_dict 20 dict def
1 dict begin
/bind { } def		% make sure we can print out the procedures
enc_dict begin

(type1enc.ps) runlibfile
enc_dict /.type1decrypt undef		% we don't need this

end end

enc_dict { 1 index where { pop pop pop } { def } ifelse } forall

% ------ Other utilities ------ %

% Test whether two values are equal (for default dictionary entries).
   /valueeq		% <obj1> <obj2> valueeq <bool>
    { 2 copy eq
       { pop pop true }
       {	% Special hack for comparing FontMatrix values
	 dup type /arraytype eq 2 index type /arraytype eq and
	  { dup length 2 index length eq
	     { true 0 1 3 index length 1 sub
		{	% Stack: arr1 arr2 true index
		  3 index 1 index get 3 index 3 -1 roll get eq not
		   { pop false exit }
		  if
		}
	       for 3 1 roll pop pop
	     }
	     { pop pop false
	     }
	    ifelse
	  }
	  { pop pop false
	  }
	 ifelse
       }
      ifelse
    } bind def

% ------ The main program ------ %

% Define the dictionary of keys to skip because they are treated specially.
/.fontskipkeys mark
  /CharStrings dup
  /Encoding dup
  /FDepVector dup
  /FID dup
  /FontInfo dup
  /Metrics dup
  /Metrics2 dup
  /Private dup
.dicttomark def
/.minfontskipkeys mark
  .fontskipkeys { } forall
  /FontName dup
  /UniqueID dup
.dicttomark def
/.privateskipkeys mark
  /ND dup
  /NP dup
  /RD dup
  /Subrs dup
.dicttomark def
/.minprivateskipkeys mark
  .privateskipkeys { } forall
  /MinFeature dup
  /Password dup
  /UniqueID dup
.dicttomark def

% Define the procedures for the Private dictionary.
% These must be defined without `bind',
% for the sake of the DISKFONTS feature.
4 dict begin
 /-! {string currentfile exch readhexstring pop} def
 /-| {string currentfile exch readstring pop} def
 /|- {readonly def} def
 /| {readonly put} def
currentdict end /encrypted_procs exch def
4 dict begin
 /-! {string currentfile exch readhexstring pop
   4330 exch dup .type1encrypt exch pop} def
 /-| {string currentfile exch readstring pop
   4330 exch dup .type1encrypt exch pop} def
 /|- {readonly def} def
 /| {readonly put} def
currentdict end /unencrypted_procs exch def

% Construct an inverse dictionary of encodings.
/encodingnames mark
 StandardEncoding /StandardEncoding
 ISOLatin1Encoding /ISOLatin1Encoding
 SymbolEncoding /SymbolEncoding
 DingbatsEncoding /DingbatsEncoding
 /resourceforall where
  { pop (*) { cvn dup findencoding exch } 100 string /Encoding resourceforall }
 if
.dicttomark def

% Invert the standard encodings.
.knownEncodings length 256 mul dict begin
  0 .knownEncodings
   {  { currentdict 1 index known { pop } { 1 index def } ifelse
	1 add
      }
     forall
   }
  forall pop
currentdict end /inverseencodings exch def

/writefont		% <psfile> writefont - (writes the current font)
 { /psfile exch def
   /Font currentfont def
   /FontInfo Font /FontInfo .knownget not { 0 dict } if def
   /FontType Font /FontType get def
   /hasPrivate Font /Private known def
   /Private hasPrivate { Font /Private get } { 0 dict } ifelse def
   /readproc binary_CharStrings { (-| ) } { (-! ) } ifelse def
   /privateprocs
     encrypt_CharStrings binary_tokens not and
      { encrypted_procs } { unencrypted_procs } ifelse
     def
   /addlenIV false def
   /changelenIV use_lenIV 0 lt
    { 0 }
    { use_lenIV Private /lenIV .knownget not
       { 4 /addlenIV use_lenIV 4 ne def } if sub }
   ifelse def
   /minimize
     smallest_output
     FontType 1 eq and
     Font /UniqueID known and
   def
   (%!FontType) ws FontType wtstring cvs ws (-1.0: ) ws
     currentfont /FontName get wt
     FontInfo /version .knownget not { (001.001) } if wl
   FontInfo /CreationDate .knownget { (%%Creation Date: ) ws wl } if
   FontInfo /VMusage .knownget
    { (%%VMusage: ) ws dup wt wtstring cvs wl }
   if
   (systemdict begin) wl

% If we're going to use eexec, create the filters now.
   /realpsfile psfile def
   eexec_encrypt
    { /eexecfilter psfile binary_CharStrings not
       { pop /bxstring 35 string def
	  { pop dup length 0 ne
	     { realpsfile exch writehexstring realpsfile (\n) writestring }
	     { pop }
	    ifelse bxstring
	  }
	 /NullEncode filter dup /hexfilter exch def
       }
      if 55665 /eexecEncode filter def
    }
   if

% Turn on binary tokens if relevant.
   binary_tokens { (currentobjectformat 1 setobjectformat) wl } if

% If the file has a UniqueID, write out a check against loading it twice.
   minimize
    { Font /FontName get wo
      Font /UniqueID get wo
      Private length addlenIV { 1 add } if wo
      Font length 1 add wo		% +1 for FontFile
      ( .checkexistingfont) wl
    }
    { Font /UniqueID known
       { ({} FontDirectory) ws Font /FontName get dup wo ( known) wl
	 ( {) ws wo ( findfont dup /UniqueID known) wl
	 (    { dup /UniqueID get) ws Font /UniqueID get wo ( eq exch /FontType get 1 eq and }) wl
	 (    { pop false } ifelse) wl
	 (    { pop save /restore load } if) wl
	 ( } if) wl
       }
      if
    }
   ifelse

% If we are writing unencrypted CharStrings for a standard environment,
% write out the encryption procedures.
   privateprocs unencrypted_procs eq standard_only and
    { (systemdict /.type1encrypt known) wl
      ( { save /restore load } { { } } ifelse) wl
      (userdict begin) wl
      enc_dict { we } forall
      (end exec) wl
    }
   if

% Write out the creation of the font dictionary and FontInfo.
   minimize not
    { Font length 1 add wo {dict begin} wol		% +1 for FontFile
    }
   if
   (/FontInfo ) ws FontInfo wd {readonly def} wol

% Write out the other fixed entries in the font dictionary.
   Font begin
   Font
    { minimize
       { .minfontskipkeys 2 index known
	  { pop pop
	  }
	  { //.compactfontdefault 2 index .knownget
	     { 1 index valueeq { pop pop } { we } ifelse }
	     { we }
	    ifelse
	  }
	 ifelse
       }
       { .fontskipkeys 2 index known { pop pop } { we } ifelse
       }
      ifelse
    } forall
   /Encoding
   encodingnames Encoding known
   name_all_Encodings
   Encoding StandardEncoding eq or
   Encoding ISOLatin1Encoding eq or and
    { encodingnames Encoding get cvx }
    { Encoding }
   ifelse
   dup /StandardEncoding cvx eq minimize and
    { pop pop }
    { we }
   ifelse

% Write the FDepVector, if any.
   Font /FDepVector .knownget
    { {/FDepVector [} wol
       { /FontName get wo {findfont} wol () wl } forall
      {] readonly def} wol
    }
   if

% Write out the Metrics, if any.
   Font /Metrics .knownget
    { (/Metrics ) ws wld {readonly def} wol
    }
   if
   Font /Metrics2 .knownget
    { (/Metrics2 ) ws wld {readonly def} wol
    }
   if

% Start the eexec-encrypted section, if applicable.
  eexec_encrypt
   { {currentdict currentfile eexec} wol () wl
     /psfile eexecfilter store
     (\000\000\000\000) ws {begin} wol
   }
  if

% Create and initialize the Private dictionary, if any.
   hasPrivate
{
   Private
   minimize
    { begin {Private dup begin}
    }
    {  dup length privateprocs length add dict copy begin
       privateprocs { readonly def } forall
       /Private wo
       currentdict length 1 add wo {dict dup begin}
    }
   ifelse wol () wl
   currentdict
    { 1 index minimize { .minprivateskipkeys } { .privateskipkeys } ifelse
      exch known
       { pop pop }
       { 1 index /lenIV eq use_lenIV 0 ge and { pop use_lenIV } if we }
      ifelse
    } forall
   addlenIV { /lenIV use_lenIV we } if
}
if

% Write the Subrs entries, if any.
   currentdict /Subrs known
    { (/Subrs[) wl
      Subrs
       { dup null ne
	  { wcs minimize not { () wl } if }
	  { pop /null cvx wo }
	 ifelse
       } forall
      {] dup {readonly pop} forall readonly def} wol () wl
    }
   if

% Wrap up the Private dictionary.
   hasPrivate
    { end			% Private
      minimize
       { {end readonly pop} }	% Private
       { {end readonly def} }	% Private in font
      ifelse wol
    }
   if

% Write the CharStrings entries.
% Detect identical (eq) entries, which bdftops produces.
   currentdict /CharStrings known
{
   /CharStrings wo CharStrings length wo
   minimize
    { encrypt_CharStrings not wo ( .readCharStrings) wl
      CharStrings length dict
      CharStrings
       { exch inverseencodings 1 index .knownget not { dup } if wo
		% Stack: vdict value key
	 3 copy pop .knownget { wo pop pop } { 3 copy put pop wcs } ifelse
       } forall
    }
    { {dict dup Private begin begin} wol () wl
      CharStrings length dict
      CharStrings
       { 2 index 1 index known
	  { exch wo 1 index exch get wo {load def} wol () wl
	  }
	  { 2 index 1 index 3 index put
	    exch wo wcs ( |-) wl
	  }
	 ifelse
       } forall
      {end end} wol
    }
   ifelse
   pop
    { readonly def }	% CharStrings in font
   wol
}
if

% Terminate the output.
   end			% Font
   eexec_encrypt
    { {end mark currentfile closefile} wol () wl
      eexecfilter dup flushfile closefile	% psfile is eexecfilter
      binary_CharStrings not { hexfilter dup flushfile closefile } if
      /psfile realpsfile store
      8
       { (0000000000000000000000000000000000000000000000000000000000000000)
         wl
       }
      repeat {cleartomark} wol
    }
   if
    { FontName currentdict end definefont pop
    }
   wol
   Font /UniqueID known { /exec cvx wo } if
   binary_tokens { /setobjectformat cvx wo } if
   ( end) wl		% systemdict

 } bind def

% ------ Other utilities ------ %

% Prune garbage characters and OtherSubrs out of the current font,
% if the relevant dictionaries are writable.
/prunefont
 { currentfont /CharStrings get wcheck
    { currentfont /CharStrings get dup [ exch
       { pop dup (S????00?) .stringmatch not { pop } if
       } forall
      ] { 2 copy undef pop } forall pop
    }
   if
 } bind def

end			% wrfont_dict

/writefont { wrfont_dict begin writefont end } def
 "NЮ2H4H"N5@ 0H2H .N2H4H-@ "NЮ2H4H"N5@ 0H2H .N2H4H-@ "NЮ2H4H"N5@ PRCDo :LN^NuNV  H0. 
<. >. Fp<$H 
f` 4 C  g
 gp `p@ Bj 5F 5G n  Bj 
Bj p ЀA00 H&@0H"N8 0H"N: Hj Bmo0-`0? mo0-`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                %!
%    Copyright (C) 1994 Aladdin Enterprises.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: zeroline.ps,v 1.2.6.1 2002/02/22 19:45:55 ray Exp $
% zeroline.ps
% Test file to determine how other PostScript implementations handle
% filling zero-width lines under a variety of conditions.

% Add a small "fan" of zero-width lines at different angles to the path.
/fan
 { currentpoint 100 0 rlineto
   2 copy moveto 100 20 rlineto
   2 copy moveto 100 100 rlineto
   2 copy moveto 20 100 rlineto
   moveto 0 100 rlineto
 } def

% Append a rectangle to the current path.
/rectappend
 { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto
   neg 0 rlineto closepath
 } def
% Fill a rectangle.
/rectfill
 { gsave newpath rectappend fill grestore
 } def
% Stroke a rectangle.
/rectstroke
 { gsave newpath rectappend stroke grestore
 } def
% Clip to a rectangle.  Unlike the real rectclip,
% this clear the current path.
/rectclip
 { newpath rectappend clip newpath
 } def

40 40 translate

% Display fans of different colors on different backgrounds.
gsave
0 setgray
0 0 120 120 rectstroke
10 10 moveto fan fill
140 0 translate
0 setgray
0 0 120 120 rectstroke
0.8 setgray
10 10 moveto fan fill
140 0 translate
0 setgray
0 0 120 120 rectfill
1 setgray
10 10 moveto fan fill
grestore
0 140 translate

% Display rectangles with two edges coincident.
gsave
newpath
0 setgray
0 0 40 40 rectappend
0 0 20 20 rectappend
eofill
60 0 translate
0 0 40 40 rectappend
40 0 -20 20 rectappend
fill
grestore
0 60 translate

% Display superimposed lines.
gsave
/super
 { currentpoint fan
   2 copy moveto 20 0 rmoveto 50 0 rlineto
   2 copy moveto 20 4 rmoveto 50 10 rlineto
   2 copy moveto 20 20 rmoveto 50 50 rlineto
   2 copy moveto 4 20 rmoveto 10 50 rlineto
   moveto 0 20 rmoveto 0 50 rlineto
 } def
0 setgray
0 0 moveto super fill
140 0 translate 0 0 moveto super eofill
grestore
0 140 translate

showpage
g\v  . f
 . g   . Jo
 . `
 . DrրpJgp `pր                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>The Ghostscript Interpreter Application Programming Interface (API)</title>
<!-- $Id: API.htm,v 1.41 2003/12/08 23:17:14 giles Exp $ -->
<!-- Supercedes the API in DLL.htm -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1>The Ghostscript Interpreter Application Programming Interface (API)</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.2 begin table of contents] ========================================= -->

<h2>Table of contents</h2>

<ul>
<li><a href="#API">What is the Ghostscript Interpreter API?</a>
<li><a href="#Exported_functions ">Exported functions</a>
<ul>
<li><a href="#revision"><b><tt>gsapi_revision</tt></b></a>
<li><a href="#new_instance"><b><tt>gsapi_new_instance</tt></b></a>
<li><a href="#delete_instance"><b><tt>gsapi_delete_instance</tt></b></a>
<li><a href="#set_stdio"><b><tt>gsapi_set_stdio</tt></b></a>
<li><a href="#set_poll"><b><tt>gsapi_set_poll</tt></b></a>
<li><a href="#set_display_callback"><b><tt>gsapi_set_display_callback</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_string_begin</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_string_continue</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_string_end</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_string_with_length</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_string</tt></b></a>
<li><a href="#init"><b><tt>gsapi_init_with_args</tt></b></a>
<li><a href="#run"><b><tt>gsapi_run_*</tt></b></a>
<li><a href="#exit"><b><tt>gsapi_exit</tt></b></a>
<li><a href="#set_visual_tracer"><b><tt>gsapi_set_visual_tracer</tt></b></a>
<li><a href="#return_codes">Return codes</a>
</ul>
<li><a href="#Example_usage">Example usage</a>
<li><a href="#stdio">Standard input and output</a>
<li><a href="#display">Display device</a>
</ul>

<!-- [1.2 end table of contents] =========================================== -->

<!-- [1.3 begin hint] ====================================================== -->

<p>For other information, see the <a href="Readme.htm">Ghostscript
overview</a>.

<p>
<b>WARNING:</b> The API described in this document is subject to changes in
future releases, possibly ones that are not backward compatible with what
is described here.

<!-- [1.3 end hint] ======================================================== -->

<hr>

<!-- [1.0 end visible header] ============================================== -->

<!-- [2.0 begin contents] ================================================== -->


<h2><a name="API"></a>What is the Ghostscript Interpreter API?</h2>

<p>
The Ghostscript interpreter can be built as a dynamic link library 
(DLL) on the Windows or OS/2 platforms, as a shared object on the 
Linux platform and as a framework on MacOS X.
With some changes, it could be built as a static library.
This document describes the Application Programming Interface (API)
for the Ghostscript interpreter library.  
This should not be confused with the 
<a href="Lib.htm">Ghostscript library</a> which provides a graphics
library but not the interpreter.
<p>
This supercedes the old <a href="DLL.htm">DLL</a> interface.
<p>
To provide the interface described in the 
<a href="Use.htm">usage documentation</a>, a smaller independent 
executable loads the DLL/shared object.
This executable must provide all the interaction with the windowing system, 
including image windows and, if necessary, a text window.

<p>
The Ghostscript interpreter library's name and characteristics differ
for each platform:

<ul>
<li>The Win32 DLL <b><tt>gsdll32.dll</tt></b> has
MULTIPLE NONSHARED data segments.  Under Win32s it can be used by only one
program at a time, but under Windows 95/98 or Windows NT it can be called by
multiple programs simultaneously.

<li>The OS/2 DLL <b><tt>gsdll2.dll</tt></b> has
MULTIPLE NONSHARED data segments and can be called by multiple programs
simultaneously.

<li>The Linux shared object <b><tt>libgs.so</tt></b>
can be used by multiple programs simultaneously.

<li>The MacOS X <b><tt>Ghostscript.framework</tt></b> can also be used
by multiple applications at once.
</ul>

<p>
The source for the executable is in <b><tt>dw</tt></b>*.* (Windows),
<b><tt>dp</tt></b>*.* (OS/2) and  <b><tt>dx</tt></b>*.* (Linux).  
See these source files for examples of how to use the DLL. A similar
example for MacOS using the Carbon API is provided in <b><tt>dm</tt></b>*.*.

<p>
The source file <tt>dxmainc.c</tt> can also serve as an example of how to use the 
framework shared component on MacOS X, providing the same command-line tool it does
on any linux, bsd or similar operating system. Just change the header includes to 
use the Ghostscript namespace:
<blockquote><pre><tt>#include &lt;Ghostscript/ierrors.h&gt;
#include &lt;Ghostscript/iapi.h&gt;</tt></pre></blockquote>
and link with:
<blockquote><pre><tt>cc -o gsc dxmainc.c -framework Ghostscript</tt></pre></blockquote>
To get a useable executable. <tt>Ghostscript.framework</tt> must be properly
installed in the search path for this to work.

<p>
At this stage, Ghostscript does not support multiple instances
of the interpreter within a single process.

<hr>

<h2><a name="Exported_functions"></a>Exported functions</h2>

<p>
The functions exported by the DLL/shared object are described 
in the header file <a href="../src/iapi.h"><b><tt>iapi.h</tt></b></a>
and are summarised below.  Omitted from the summary are
the calling convention (e.g. __stdcall), details of return 
values and error handling.


<ul>
<li><b><tt>
int 
<a href="#revision">gsapi_revision</a>
  (gsapi_revision_t *pr, int len);
</tt></b>

<li><b><tt>
int 
<a href="#new_instance">gsapi_new_instance</a>
(gs_main_instance **pinstance, void *caller_handle);
</tt></b>

<li><b><tt>
void 
<a href="#delete_instance">gsapi_delete_instance</a>
(gs_main_instance *instance);
</tt></b>

<li><b><tt>
int 
<a href="#set_stdio">gsapi_set_stdio</a>
(gs_main_instance *instance,
    int(*stdin_fn)(void *caller_handle, char *buf, int len),
    int(*stdout_fn)(void *caller_handle, const char *str, int len),
    int(*stderr_fn)(void *caller_handle, const char *str, int len));
</tt></b>

<li><b><tt>
int 
<a href="#set_poll">gsapi_set_poll</a>
(gs_main_instance *instance, int(*poll_fn)(void *caller_handle));
</tt></b>

<li><b><tt>
int 
<a href="#set_display_callback">gsapi_set_display_callback</a>
(gs_main_instance *instance, display_callback *callback);
</tt></b>

<li><b><tt>
int 
<a href="#init">gsapi_init_with_args</a>
(gs_main_instance *instance, int argc, char **argv);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_string_begin</a>
(gs_main_instance *instance, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_string_continue</a>
(gs_main_instance *instance, 
    const char *str, unsigned int length, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_string_end</a>
(gs_main_instance *instance, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_string_with_length</a>
(gs_main_instance *instance, 
    const char *str, unsigned int length, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_string</a>
(gs_main_instance *instance, 
    const char *str, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#run">gsapi_run_file</a>
(gs_main_instance *instance, 
    const char *file_name, int user_errors, int *pexit_code);
</tt></b>

<li><b><tt>
int 
<a href="#exit">gsapi_exit</a>
(gs_main_instance *instance);
</tt></b>

<li><b><tt>
int
<a href="#set_visual_tracer">gsapi_set_visual_tracer</a>
(gstruct vd_trace_interface_s *I);
</tt></b>

</ul>

<h3><a name="revision"></a><b><tt>gsapi_revision()</tt></b></h3>

<blockquote>
This function returns the revision numbers and strings of the Ghostscript
interpreter library; you should call it before any other interpreter
library functions to make sure that the correct version of the 
Ghostscript interpreter has been loaded.

<blockquote>
<pre>
typedef struct gsapi_revision_s {
    const char *product;
    const char *copyright;
    long revision;
    long revisiondate;
} gsapi_revision_t;
gsapi_revision_t r;

if (gsapi_revision(&amp;r, sizeof(r)) == 0) {
    if (r.revision < 650)
       printf("Need at least Ghostscript 6.50");
}
else {
    printf("revision structure size is incorrect");
}
</pre></blockquote>
</blockquote>


<h3><a name="new_instance"></a><b><tt>gsapi_new_instance()</tt></b></h3>
<blockquote>
Create a new instance of Ghostscript.
This instance is passed to most other gsapi functions.
The caller_handle will be provided to callback functions.
<b>At this stage, Ghostscript supports only one instance</b>.
</blockquote>


<h3><a name="delete_instance"></a><b><tt>gsapi_delete_instance()</tt></b></h3>
<blockquote>
Destroy an instance of Ghostscript.
Before you call this, Ghostscript must have finished.
If Ghostscript has been initialised, you must call 
<b><tt>gsapi_exit</tt></b> before <b><tt>gsapi_delete_instance</tt></b>.
</blockquote>


<h3><a name="set_stdio"></a><b><tt>gsapi_set_stdio()</tt></b></h3>
<blockquote>
Set the callback functions for stdio
The stdin callback function should return the number of
characters read, 0 for EOF, or -1 for error.
The stdout and stderr callback functions should return
the number of characters written.
</blockquote>


<h3><a name="set_poll"></a><b><tt>gsapi_set_poll()</tt></b></h3>
<blockquote>
Set the callback function for polling.
This is used for handling window events or cooperative
multitasking.  This function will only be called if
the Ghostscript interpreter was compiled with <b><tt>CHECK_INTERRUPTS</tt></b>
as described in <b><tt><a href="../src/gpcheck.h">gpcheck.h</a></tt></b>.
The polling function should return zero if all is well,
and return negative if it wants ghostscript to abort.
The polling function must be fast.
</blockquote>

<h3><a name="set_display_callback"></a><b><tt>gsapi_set_display_callback()</tt></b></h3>
<blockquote>
Set the callback structure for the <a href="#display">display</a>
device.  If the <a href="#display">display</a> device is used, 
this must be called after 
<b><tt>gsapi_new_instance()</tt></b>
and before <b><tt>gsapi_init_with_args()</tt></b>.
See <b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b>
for more details.
</blockquote>

<h3><a name="init"></a><b><tt>gsapi_init_with_args()</tt></b></h3>
<blockquote>
Initialise the interpreter.
This calls <b><tt>gs_main_init_with_args()</tt></b> in 
<b><tt><a href="../src/imainarg.c">imainarg.c</a></tt></b>.
See below for <a href="#return_codes">return codes</a>.
The arguments are the same as the "C" main function:
argv[0] is ignored and the user supplied arguments 
are argv[1] to argv[argc-1].
</blockquote>

<h3><a name="run"></a><b><tt>gsapi_run_*()</tt></b></h3>
<blockquote>
The <b><tt>gsapi_run_*</tt></b> functions are like 
<b><tt>gs_main_run_*</tt></b> except that the error_object is omitted.
If these functions return <= -100, either quit or a fatal
error has occured.  You must call <b><tt>gsapi_exit()</tt></b> next.
The only exception is <b><tt>gsapi_run_string_continue()</tt></b>
which will return <b><tt>e_NeedInput</tt></b> if all is well.
See below for <a href="#return_codes">return codes</a>.
<p>
There is a 64 KB length limit on any buffer submitted to a 
<tt>gsapi_run_*</tt> function for processing. If you have more
than 65535 bytes of input then you must split it into smaller 
pieces and submit each in a separate 
<tt>gsapi_run_string_continue()</tt> call.
</blockquote>

<h3><a name="exit"></a><b><tt>gsapi_exit()</tt></b></h3>
<blockquote>
Exit the interpreter.
This must be called on shutdown if <b><tt>gsapi_init_with_args()</tt></b>
has been called, and just before <b><tt>gsapi_delete_instance()</tt></b>.
</blockquote>

<h3><a name="set_visual_tracer"></a><b><tt>gsapi_set_visual_tracer()</tt></b></h3>
<blockquote>
Pass visual tracer interface block to Ghostscript.
See <a href="Lib.htm#Visual_trace"><b><tt>Lib.htm</tt></b></a> for reference about 
the interface block structure.
This function is useful for debug clients only. Release clients must not call it.
</blockquote>


<h3><a name="return_codes"></a>Return codes</h3>

<p>
The <b><tt>gsapi_init_with_args</tt></b>, <b><tt>gsapi_run_*</tt></b> and
<b><tt>gsapi_exit</tt></b> functions return an integer code.

<p>
<table width="80%" align="center" cellpadding=0 cellspacing=0>
<tr><th colspan=3 bgcolor="#CCCC00"><hr><font size="+1">Return codes from <b><tt>gsapi_*()</tt></b></font><hr>
<tr valign=bottom>
	<th align=left>Code
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
	<th align=left>Status
<tr>	<td colspan=3><hr>
<tr valign=top>	<td align=left>0
	<td>&nbsp;
	<td>No errors
<tr valign=top>	<td align=left>e_Quit
	<td>&nbsp;
	<td>"<b><tt>quit</tt></b>" has been executed.
	This is not an error.
	<b><tt>gsapi_exit()</tt></b> must be called next.
<tr valign=top>	<td align=left>e_NeedInput
	<td>&nbsp;
	<td>More input is needed by
        <b><tt>gsapi_run_string_continue()</tt></b>.
        This is not an error.
<tr valign=top>	<td align=left>e_Info
	<td>&nbsp;
	<td>"<b><tt>gs -h</tt></b>" has been executed. 
	This is not an error.
	<b><tt>gsapi_exit()</tt></b> must be called next.
<tr valign=top>	<td align=left>&lt; 0
	<td>&nbsp;
	<td>Error
<tr valign=top>	<td align=left>&lt;= -100
	<td>&nbsp;
	<td>Fatal error.
<b><tt>gsapi_exit()</tt></b> must be called next.
</table>
</blockquote>

<p>
The <b><tt>gsapi_run_*()</tt></b> functions do not flush stdio.
If you want to see output from Ghostscript you
must do this explicitly as shown in the example below.

<p>
When executing a string with <b><tt>gsapi_run_string_*()</tt></b>,
<b><tt>currentfile</tt></b> is the input from the string.
Reading from <b><tt>%stdin</tt></b> uses the stdin callback.
</blockquote>



<h2><a name="Example_usage"></a>Example Usage</h2>
Some overly simple examples of using the Ghostscript interpreter library 
are below.  Some more examples including other programming languages
may be found at
<a href="http://www.cs.wisc.edu/~ghost/doc/gsapi.htm">
http://www.cs.wisc.edu/~ghost/doc/gsapi.htm</a>.

<p>To use try out these examples in a development environment like Microsoft's
developer tools or Metrowerks Codewarrior, create a new project, save the example
source code as a <tt>.c</tt> file and add it, along with the Ghostscript dll or shared
library. You will also need to make sure the Ghostscript headers are available, either
by adding their location (the <tt>src</tt> directory in the Ghostscript source
distribution) to the project's search path, or by copying ierrors.h and iapi.h into the
same directory as the example source.</p>
  
<h3>Example 1</h3>
<pre>
/* Example of using GS DLL as a ps2pdf converter.  */

#if defined(_WIN32) && !defined(_Windows)
# define _Windows
#endif
#ifdef _Windows
/* add this source to a project with gsdll32.dll, or compile it directly with:
 *   cl -D_Windows -Isrc -Febin\ps2pdf.exe ps2pdf.c bin\gsdll32.lib
 */
# include &lt;windows.h&gt;
# define GSDLLEXPORT __declspec(dllimport)
#endif

#include "ierrors.h"
#include "iapi.h"

gs_main_instance *minst;

int main(int argc, char *argv[])
{
    int code, code1;
    const char * gsargv[10];
    int gsargc;
    gsargv[0] = "ps2pdf";	/* actual value doesn't matter */
    gsargv[1] = "-dNOPAUSE";
    gsargv[2] = "-dBATCH";
    gsargv[3] = "-dSAFER";
    gsargv[4] = "-sDEVICE=pdfwrite";
    gsargv[5] = "-sOutputFile=out.pdf";
    gsargv[6] = "-c";
    gsargv[7] = ".setpdfwrite";
    gsargv[8] = "-f";
    gsargv[9] = "input.ps";
    gsargc=10;

    code = gsapi_new_instance(&minst, NULL);
    if (code &lt; 0)
	return 1;
    code = gsapi_init_with_args(minst, gsargc, gsargv);
    code1 = gsapi_exit(minst);
    if ((code == 0) || (code == e_Quit))
	code = code1;

    gsapi_delete_instance(minst);

    if ((code == 0) || (code == e_Quit))
	return 0;
    return 1;
}
</pre>

<h3>Example 2</h3>
<pre>
/* Similar to command line gs */

#if defined(_WIN32) && !defined(_Windows)
# define _Windows
#endif
#ifdef _Windows
/* Compile directly with:
 *   cl -D_Windows -Isrc -Febin\gstest.exe gstest.c bin\gsdll32.lib
 */
# include &lt;windows.h&gt;
# define GSDLLEXPORT __declspec(dllimport)
#endif
#include &lt;stdio.h&gt;
#include "ierrors.h"
#include "iapi.h"

/* stdio functions */
static int GSDLLCALL
gsdll_stdin(void *instance, char *buf, int len)
{
    int ch;
    int count = 0;
    while (count &lt; len) {
	ch = fgetc(stdin);
	if (ch == EOF)
	    return 0;
	*buf++ = ch;
	count++;
	if (ch == '\n')
	    break;
    }
    return count;
}

static int GSDLLCALL
gsdll_stdout(void *instance, const char *str, int len)
{
    fwrite(str, 1, len, stdout);
    fflush(stdout);
    return len;
}

static int GSDLLCALL
gsdll_stderr(void *instance, const char *str, int len)
{
    fwrite(str, 1, len, stderr);
    fflush(stderr);
    return len;
}

gs_main_instance *minst;
const char start_string[] = "systemdict /start get exec\n";

int main(int argc, char *argv[])
{
    int code, code1;
    int exit_code;

    code = gsapi_new_instance(&minst, NULL);
    if (code < 0)
	return 1;
    gsapi_set_stdio(minst, gsdll_stdin, gsdll_stdout, gsdll_stderr);
    code = gsapi_init_with_args(minst, argc, argv);
    if (code == 0)
	code = gsapi_run_string(minst, start_string, 0, &exit_code);
    code1 = gsapi_exit(minst);
    if ((code == 0) || (code == e_Quit))
	code = code1;

    gsapi_delete_instance(minst);

    if ((code == 0) || (code == e_Quit))
	return 0;
    return 1;
}
</pre>

<h3>Example 3</h3>

Replace main() in either of the above with the following code,
showing how you can feed Ghostscript piecemeal:
<pre>
const char *command = "1 2 add == flush\n";

int main(int argc, char *argv[])
{
    int code, code1;
    int exit_code;

    code = gsapi_new_instance(&minst, NULL);
    if (code < 0)
	return 1;
    code = gsapi_init_with_args(minst, argc, argv);

    if (code == 0) {
	gsapi_run_string_begin(minst, 0, &exit_code);
	gsapi_run_string_continue(minst, command, strlen(command), 0, &exit_code);
	gsapi_run_string_continue(minst, "qu", 2, 0, &exit_code);
	gsapi_run_string_continue(minst, "it", 2, 0, &exit_code);
	gsapi_run_string_end(minst, 0, &exit_code);
    }

    code1 = gsapi_exit(minst);
    if ((code == 0) || (code == e_Quit))
	code = code1;

    gsapi_delete_instance(minst);

    if ((code == 0) || (code == e_Quit))
	return 0;
    return 1;
}
</pre>


<h2><a name="Multiple_threads"></a>Multiple threads</h2>
The Ghostscript library should have been compiled with a 
thread safe run time library.
Synchronisation of threads is entirely up to the caller.
The exported <a href="#Exported_functions "><b><tt>gsapi_*()</tt></b></a>
functions must be called from one thread only.

<h2><a name="stdio"></a>Standard input and output</h2>
<p>
When using the Ghostscript interpreter library interface, you have a 
choice of two standard input/output methods.
<ul>
<li>If you do nothing, the "C" stdio will be used.
<li>If you use <b><tt>gsapi_set_stdio()</tt></b>,  all stdio will 
 be redirected to the callback functions you provide.
 This would be used in a graphical user interface environment 
 where stdio is not available, or where you wish to process 
 Ghostscript input or output.
</ul>
<p>
The callback functions are described in 
<a href="../src/iapi.h"><b><tt>iapi.h</tt></b></a>.


<h2><a name="display"></a>Display device</h2>
<p>
The <b><tt>display</tt></b> device is available for use with
the Ghostscript interpreter library.  This is described in the file 
<b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b>.
This device provides you with access to the raster output of
Ghostscript.  It is your responsibility to copy this raster
to a display window or printer.
<p>
To use this device, you must provide a callback structure
with addresses of a number of callback functions.
The address of the callback structure is provided using 
<b><tt>gsapi_set_display_callback()</tt></b>.
This must be called after 
<b><tt>gsapi_new_instance()</tt></b>
and before
<b><tt>gsapi_init_with_args()</tt></b>.
<p>
The callbacks are for device open, close, resize, sync, page,
memory allocation and updating.
Each callback function contains a handle can be set using
<blockquote>
  -dDisplayHandle=1234
</blockquote>
<p>
The device raster format can be configured using
<blockquote>
  -dDisplayFormat=NNNN
</blockquote>
Options include
<ul>
<li> native, gray, RGB or CMYK color spaces.
<li> alpha byte (ignored).
<li> 1 to 16 bits/component.
<li> bigendian (RGB) or littleendian (BGR) order.
<li> top first or bottom first raster.
<li> 16 bits/pixel with 555 or 565 bitfields.
</ul>
The format values are described in 
<b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b>.
The format is flexible enough to support common Windows, OS/2, Linux
and Mac raster formats.  To select the display device with a 
Windows 24-bit RGB raster:
<pre>
    char **nargv;
    char arg1[64];
    char arg2[64];
    char arg3[64];
    code = gsapi_new_instance(&minst, NULL);
    gsapi_set_stdio(minst, gsdll_stdin, gsdll_stdout, gsdll_stderr);
    code = gsapi_set_display_callback(minst, &display_callback);
    sprintf(arg1, "-sDEVICE=display");
    sprintf(arg2, "-dDisplayHandle=%d", 0);
    sprintf(arg3, "-dDisplayFormat=%d", 
        DISPLAY_COLORS_RGB | DISPLAY_ALPHA_NONE | DISPLAY_DEPTH_8 | 
        DISPLAY_LITTLEENDIAN | DISPLAY_BOTTOMFIRST);
    nargv = (char **)malloc((argc + 4) * sizeof(char *));
    nargv[0] = argv[0];
    nargv[1] = arg1;
    nargv[2] = arg2;
    nargv[3] = arg3;
    memcpy(nargv + 4, argv + 1, argc * sizeof(char *));
    argc += 3;
    code = gsapi_init_with_args(minst, argc, nargv);
</pre>

<p>
The display device provides you with the address and size of the
raster using the <b><tt>display_size()</tt></b> callback.
You are then responsible for displaying this raster.
Some examples are in 
<b><tt><a href="../src/dwmain.c">dwmain.c</a></tt></b> (Windows),
<b><tt><a href="../src/dpmain.c">dpmain.c</a></tt></b> (OS/2) and  
<b><tt><a href="../src/dxmain.c">dxmain.c</a></tt></b> (X11/Linux), and  
<b><tt><a href="../src/dmmain.c">dmmain.c</a></tt></b> (MacOS Classic or Carbon).  

<p>

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>


<p>
<small>Copyright &copy; 2003 artofcode LLC.  All rights reserved.</small>

<p>
This software is provided AS-IS with no warranty, either express or
implied.

This software is distributed under license and may not be copied,
modified or distributed except as expressly authorized under the terms
of the license contained in the file LICENSE in this distribution.

For more information about licensing, please refer to
http://www.ghostscript.com/licensing/. For information on
commercial licensing, go to http://www.artifex.com/licensing/ or
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
San Rafael, CA  94903, U.S.A., +1(415)492-9861.

<p>
<small>Ghostscript version 8.12, 8 December 2003


<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
     1 *A MacDim module from Ibrium HB     W  gScreen res:p     |  Screen size:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ghostscript problem report form</title>
<!-- $Id: Bug-form.htm,v 1.39 2003/12/08 23:17:14 giles Exp $ -->
<!-- Originally: bug-form.txt -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1>Ghostscript problem report form</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.0 end visible header] ============================================== -->

<!-- [2.0 begin contents] ================================================== -->

<p>
Before using this form, please read the <a
href="Bug-info.htm">instructions</a> for reporting problems. If you are
running a developer or beta version of Ghostscript, and you are an
experienced tester (for example, if you have been testing Ghostscript
for more than a year, or you have already submitted at least two problem
reports that we accepted for investigation), you can send an informal report
to the place indicated below. Otherwise, please fill out this form
completely. Fill out <strong>all</strong> applicable items in this form.

<p>
Most importantly, you <strong>must</strong> include all data (PostScript files,
PDF files, batch/script files, and/or fonts) required to reproduce the problem,
either
by giving a URL from which we can download the data, or by including the
data with the report itself. If you don't include this information, we can't
investigate the problem. Please note that the bug reports are publicly
archived, so the information you provide will be generally available. If the
test data absolutely must remain confidential, please so indicate on the form
below and provide an address we may contact privately for the file. 

<p>
Once you have prepared the report, go to <a
href="http://bugs.ghostscript.com" 
class="offsite">http://bugs.ghostscript.com</a>. 
and follow the instructions there. Data files can be attached to the 
bug report after the bug is submitted. 
Use the completed problem reporting form as 
the body of the Bugzilla submission. If by some reason the Bugzilla doesn't
work for you, bugs can be submitted as follows:

<ul>

<li>If you are running MS-DOS, MS Windows, or OS/2, and you are reasonably
sure that the problem is specific to your platform, mail to <a
href="mailto:bug-gswin@ghostscript.com">bug-gswin@ghostscript.com</a>.

<li>If you are running MacOS, and you are reasonably sure that the problem
is specific to the Mac, mail to <a
href="mailto:mac-gs@ghostscript.com">mac-gs@ghostscript.com</a>.

<li>Otherwise, mail to <a
href="mailto:bug-gs@ghostscript.com">bug-gs@ghostscript.com</a>.

</ul>

<p>
Fully completed problem reports help us improve Ghostscript.  Thanks in
advance.

<pre>
------------------------------------------------------------------------
Symptoms:



------------------------------------------------------------------------
Ghostscript version (or include output from "gs -h"):

------------------------------------------------------------------------
Where you got Ghostscript:

------------------------------------------------------------------------
Hardware system you are using (including printer model if the problem
involves printing):

------------------------------------------------------------------------
Operating system you are using:

------------------------------------------------------------------------
If you are using X Windows, and your problem involved output to the
screen, the output from running xdpyinfo and xwininfo:

------------------------------------------------------------------------
C compiler you are using, including its version, if you compiled
Ghostscript yourself:

------------------------------------------------------------------------
If you compiled Ghostscript yourself, changes you made to the makefiles:

------------------------------------------------------------------------
Environment variables:

	GS_DEVICE

	GS_FONTPATH

	GS_LIB

	GS_OPTIONS

------------------------------------------------------------------------
Command line:

------------------------------------------------------------------------
URL or FTP location of test files (include the data at the end of this
form if 500K or less):


------------------------------------------------------------------------
Suggested fix, if any:



------------------------------------------------------------------------
Other comments:



</pre>

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>

<p>
<small>Copyright &copy; 1996, 2001 artofcode LLC.  All rights
reserved.</small>

<p>
<small>This file is part of AFPL Ghostscript.  See the <a
href="Public.htm">Aladdin Free Public License</a> (the "License") for full
details of the terms of using, copying, modifying, and redistributing AFPL
Ghostscript.</small>

<p>
<small>Ghostscript version 8.12, 8 December 2003

<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
                    q? ?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Reporting Ghostscript problems</title>
<!-- $Id: Bug-info.htm,v 1.38 2003/12/08 23:17:14 giles Exp $ -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1>Reporting Ghostscript problems</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.0 end visible header] ============================================== -->

<!-- [2.0 begin contents] ================================================== -->

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>

<p>
The Ghostscript development team wants Ghostscript to be of high quality,
but we have limited resources for responding to problems, so please read
this document carefully.  Read each section in order, and follow the
instructions in the first one that applies to your situation.  We appreciate
problem reports, since they help us improve the quality of Ghostscript, but
please help us by following the procedure below.

<p>
While we do try to respond to all reports, we give priority to the following
classes of users:

<ol>
<li>Beta testers who have actually given us at least one report on some beta
version supplied to them.

<li>People developing drivers for Ghostscript or applications based on it,
and that will be made freely available.

<li>People who express serious interest in <a
href="New-user.htm#Commercial_use">licensing Ghostscript commercially</a>.

<li>Other people who have signed up as testers of developer releases.

</ol>

<p>
We currently have access to systems running Linux, Solaris, Microsoft
Windows (various versions), and MacOS; gcc, Borland C++ Builder, Watcom C++,
Microsoft Visual C++, and Metrowerks CodeWarrior.  If your problem turns
out to be specific to some other hardware or software configuration, it may
take longer to track down, since we will have to rely on other users to
help.

<h2>Check that you have a good copy of the most recent version.</h2>

<p>
Go to

<a href="http://www.ghostscript.com/"
 class="offsite">http://www.ghostscript.com/</a>

and see if the version number of your Ghostscript installation is the
most recent available. If not try upgrading to the latest stable or beta 
release and see if that fixes the problem.

<p>
You can find out what version of Ghostscript you have by typing:

<blockquote><pre>
gs --version
</pre></blockquote>

<p>
(or <b><tt>gswin32c</tt></b>, or whatever your Ghostscript executable is
named).

<p>
If you aren't running the most recent version, please get the most recent
version and install it, per the instructions in <a
href="Install.htm">Install.htm</a>.  Check whether the problem is still
there.  If it is, go on to the next step.

<p>
Even if you are running the most recent version, it is possible that you may
be running a modified copy.  We are confident that copies on the SourceForge
site just mentioned, our other master distribution site on
<a href="ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/"
class="offsite">mirror.cs.wisc.edu</a>, and CD-ROMs of commercial
Linux
distributions are good; if you got Ghostscript somewhere else, please update
it from one of these places, and check whether the problem is still there
before proceeding.

<h2>Check whether your problem is already known.</h2>

<p>
Go to 

<blockquote>
<a href="http://bugs.ghostscript.com" class="offsite">
http://bugs.ghostscript.com</a>
</blockquote>

<p>
and see whether your problem is already known.  If it is, you may want to
add a follow-up comment to the report.  If it isn't, go on to the next step.

<h2>Have you ever run Ghostscript successfully?</h2>

<p>
If your problem is connected with installing or configuring Ghostscript, and
you haven't yet been able to run it successfully, we're sorry, but we can't
provide help.  You might want to re-read the <a
href="Install.htm">instructions</a> for installing Ghostscript, mentioned
above.  If that doesn't help, all we can suggest is that you post your
problem to the Usenet newsgroup <a
href="news:comp.lang.postscript">comp.lang.postscript</a>.  If, after you
find the solution, you have suggestions for improving the documentation,
please let us know.

<h2>Reproduce the problem with Ghostscript alone.</h2>

<p>
If you are running Ghostscript through some other piece of software, such as
a GUI-based viewer, you will have to reproduce the problem with Ghostscript
alone before we can look at it.

<ul>

<li>If you are running Ghostscript through Ghostview (for Unix and Linux),
try to run the same file through Ghostscript (<b><tt>gs</tt></b>) without
using Ghostview.  If you don't know how to do this, or the problem doesn't
show up, please contact <a
href="mailto:ghostview@cs.wisc.edu">ghostview@cs.wisc.edu</a>.

<li>If you are running Ghostscript through GSview (for MS Windows and OS/2),
try to run the same file through Ghostscript (<b><tt>gswin32</tt></b> or
<b><tt>gswin32c</tt></b>) without using GSview.  To find out more details
about how GSview is calling Ghostscript, start GSview with debugging enabled
(e.g. <b><tt>gsview&nbsp;/d</tt></b>): these details can be seen using "File
| Show Messages" and can be copied to the clipboard for pasting into a text
document.  If you have trouble doing this, or if you can't reproduce the
original problem with Ghostscript alone, please contact <a
href="mailto:gsview@ghostgum.com.au">gsview@ghostgum.com.au</a>.

<li>If you are running Ghostscript through any other software (e.g.,
<b><tt>dvips</tt></b>, a printer spooler, etc.), we are sorry, but we cannot
help you unless you can tell us how to produce the problem using Ghostscript
alone.

</ul>

<h2>Check whether you are using a third-party printer driver.</h2>

<p>
The file <b><tt>src/devs.mak</tt></b> lists all the drivers about which we
can answer questions; the file <b><tt>src/contrib.mak</tt></b> lists all the
other drivers.  If you are using a driver listed in the latter file, please
try to reproduce the problem using a driver listed in the former.  If you
can't, please contact the author of the problem driver.

<h2>Send us a problem report.</h2>

<p>
Please go to the problem reporting form in <a
href="Bug-form.htm">Bug-form.htm</a> and follow its instructions.

<!-- [3.0 begin visible trailer]
============================================= -->
<hr>

<p>
<small>Copyright &copy; 2000 Aladdin Enterprises.  All
rights reserved.</small>

<p>
This software is provided AS-IS with no warranty, either express or
implied.

This software is distributed under license and may not be copied,
modified or distributed except as expressly authorized under the terms
of the license contained in the file LICENSE in this distribution.

For more information about licensing, please refer to
http://www.ghostscript.com/licensing/. For information on
commercial licensing, go to http://www.artifex.com/licensing/ or
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
San Rafael, CA  94903, U.S.A., +1(415)492-9861.

<p>
<small>Ghostscript version 8.12, 8 December 2003


<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
U$DDD$E$3DDB"DBD#CDDC4DCC4DC#4$CDDB#$4$D"DBDD4#D#4$DDEDDDE4D4"$3"D$B""DDCDD4DDCDDD42#B%2$BDDD4$@BEDDDDDD"DDDDCD4"DD$B4D$4DB$"$C"$DDB$B$4DDD$C$4D$44$BD3$BDB3D4DD3BDBD"B$44DBDDD4$3D4$CDB$404DD!$                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ghostscript C coding guidelines</title>
<!-- $Id: C-style.htm,v 1.45 2003/12/08 23:17:14 giles Exp $ -->
<!-- Originally: c-style.txt -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1>Ghostscript C coding guidelines</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.2 begin table of contents] ========================================= -->

<h2>Table of contents</h2>

<blockquote><ul>
<li><a href="#Introduction">Introduction</a>
<li><a href="#C_language">C language do's and don'ts</a>
<ul>
<li>Preprocessor:
    <a href="#Conditionals">Conditionals</a>,
    <a href="#Macros">Macros</a>,
    <a href="#Preprocessor_other">Other</a>
<li><a href="#Lexical_elements">Lexical elements</a>
<li><a href="#Scoping">Scoping</a>
<li>Data types:
    <a href="#Scalars">Scalars</a>,
    <a href="#Arrays">Arrays</a>,
    <a href="#Typedefs">Typedefs</a>,
    <a href="#Structures">Structures</a>,
    <a href="#Unions">Unions</a>
<li><a href="#Expressions">Expressions</a>
<li><a href="#Statements">Statements</a>
<li><a href="#Procedures">Procedures</a> (prototypes and definitions)
<li><a href="#Standard_library">Standard library</a>
</ul>
<li><a href="#Language_extensions">Language extensions</a>
<li><a href="#Stylistic_conventions">Stylistic conventions</a>
<ul>
<li>Formatting:
    <a href="#Indentation">Indentation</a>,
    <a href="#Spaces">Spaces</a>,
    <a href="#Parentheses">Parentheses</a>
<li><a href="#Preprocessor_style">Preprocessor</a>
<li><a href="#Naming">Naming</a>
<li><a href="#Types">Types</a>
<li><a href="#Procedures_style">Procedures</a>,
<li>Miscellany:
    <a href="#Local_variables">Local variables</a>,
    <a href="#Compiler_warnings">Compiler warnings</a>
</ul>
<li><a href="#File_structuring">File structuring and naming</a>
<ul>
<li><a href="#All_files">All files</a>
<li><a href="#Makefiles">Makefiles</a>
<li><a href="#General_C_code">General C Code</a>
<li><a href="#Headers">Headers (<b><tt>.h</tt></b> files)</a>
<li><a href="#Source">Source (<b><tt>.c</tt></b> files)</a>
</ul>
<li><a href="#Conventions">Ghostscript conventions</a>
<ul>
<li><a href="#Specific_names">Specific names</a>:
    <a href="#code"><b><tt>code</tt></b></a>,
    <a href="#status"><b><tt>status</tt></b></a>
<li><a href="#Structure_type_descriptors">Structure type descriptors</a>
<li><a href="#Objects">"Objects"</a>
<li><a href="#Error_handling">Error handling</a>
</ul>
</ul></blockquote>

<!-- [1.2 end table of contents] =========================================== -->

<!-- [1.3 begin hint] ====================================================== -->

<p>
For other information, see the <a href="Readme.htm">Ghostscript
overview</a>.

<!-- [1.3 end hint] ======================================================== -->

<hr>

<!-- [1.0 end visible header] ============================================== -->

<!-- [2.0 begin contents] ================================================== -->

<h2><a name="Introduction"></a>Introduction</h2>

<p>
This document describes Ghostscript's C coding conventions.  It is primarily
<em>prescriptive</em>, documenting what developers should do when writing
new code; the companion developer documentation (<a
 href="Develop.htm">Develop.htm</a>) is primarily <em>descriptive</em>,
documenting the way things are.

<p>
We encourage following the general language usage and stylistic rules for
any code that will be integrated with Ghostscript, even if the code doesn't
use Ghostscript's run-time facilities or have anything to do with
PostScript, PDF, or page description languages.  Ghostscript itself follows
some additional conventions; these are documented separately under "<a
href="#Conventions">Ghostscript conventions</a>" below.

<hr>

<h2><a name="C_language"></a>C language do's and don'ts</h2>

<p>
There are several different versions of the C language, and even of the ANSI
C standard.  Ghostscript versions through 7.0 were designed to compile on
pre-ANSI compilers as well as on many compilers that implemented the ANSI
standard with varying faithfulness.  Ghostscript versions since 7.0 do not
cater for pre-ANSI compilers: they must conform to the ANSI 1989 standard
(ANS X3.159-1989), with certain restrictions and a few conventional
additions.

<h3>Preprocessor</h3>

<h4><a name="Conditionals"></a>Conditionals</h4>

Restrictions:

<ul>

<li>Don't assume that <b><tt>#if</tt></b> will treat undefined names as 0.
While the ANSI standard requires this, it may produce a warning.

<li>In <b><tt>.c</tt></b> files, don't use preprocessor conditionals that
test for individual platforms or compilers.  Use them only in header files
named xxx<b><tt>_.h</tt></b>.

</ul>

<h4><a name="Macros"></a>Macros</h4>

<p>
Restrictions:

<ul>

<li>Don't redefine a macro, even with the same definition, without using
<b><tt>#undef</tt></b>.

<li><b><tt>CAPITALIZE</tt></b> macro names unless there is a good reason not
to.

<li>Even though the legacy code contains some macros which contain
control flow statments, avoid the use of this in new code and do not
create macros which contain hidden control flow, especially 'return'.
The use of control flow in macros complicates debug significantly
requiring tedious expansion of macros to build a module to be debugged
or resorting to disassembly windows to set breakpoints or to trace
flow.

<li>Don't use a macro call within a macro argument if the call expands to a
token sequence that includes any commas not within parentheses: this
produces different results depending on whether the compiler expands the
inner call before or after the argument is substituted into the macro body.
(The ANSI standard says that calls must be expanded after substitution, but
some compilers do it the other way.)

<li>Don't use macro names, even inadvertently, in string constants.  Some
compilers erroneously try to expand them.

<li>Don't use macros to define shorthands for casted pointers.  For
instance, avoid

<blockquote><b><tt>
#define fdev ((gx_device_fubar *)dev)
</tt></b></blockquote>

<p>
and instead use

<blockquote><b><tt>
gx_device_fubar * const fdev = (gx_device_fubar *)dev;
</tt></b></blockquote>

<p>
The use of <b><tt>const</tt></b> alerts the reader that this is effectively
a synonym.

<li>If a macro generates anything larger than a single expression (that is,
one or more statements), surround it with <b><tt>BEGIN</tt></b> and
<b><tt>END</tt></b>.  These work around the fact that simple statements and
compound statements in C can't be substituted for each other syntactically.

<li>If a macro introduces local variables, only use names that end with an
underscore (<b><tt>_</tt></b>), such as <b><tt>code_</tt></b>.  This avoids
clashes both with ordinary variable names (which should never end with an
underscore) and with system-defined names (which may begin with an
underscore).

</ul>

<h3><a name="Preprocessor_other"></a>Other</h3>

<p>
Restrictions:

<ul>

<li>Only use <b><tt>#pragma</tt></b> in files that are explicitly identified
as being platform-dependent.  Many compilers complain if this is used at
all, and some complain if they don't recognize the specific pragma being
requested (both incorrect according to the ANSI standard).

</ul>

<h3><a name="Lexical_elements"></a>Lexical elements</h3>

<p>
Do not use:

<ul>

<li>ANSI trigraphs (??x)
<li>Nested comments (/* /* */ */) (not ANSI compliant, but often accepted)
<li>Multi-character character constants ('abc')
<li>Wide-character character or string constants (L'x', L"x")

</ul>

<p>
Restrictions:

<ul>

<li>Procedure and static variable names must be 31 characters or less.

<li>Externally visible procedure and variable names must be unique in the
first 23 characters.

</ul>

<h3><a name="Scoping"></a>Scoping (extern, static, ...)</h3>

<p>
Do not use:

<ul>

<li><b><tt>register</tt></b>

</ul>

<p>
Restrictions:

<ul>

<li>Do not allow a global variable (constant) to have more than one
non-<b><tt>extern</tt></b> definition, even though some ANSI C compilers
allow this.  Every global constant should have exactly one definition, in a
<b><tt>.c</tt></b> file, and preferably just one <b><tt>extern</tt></b>
declaration, in a header file.

<li>Use <b><tt>private</tt></b> instead of <b><tt>static</tt></b> for
procedures and variables declared at the outermost scope of a file.  This
allows making such constructs either visible or invisible to profilers by
changing a single <b><tt>#define</tt></b>.

<li><b><tt>static</tt></b> or <b><tt>private</tt></b> variables must be
<b><tt>const</tt></b> and initialized: non-<b><tt>const</tt></b> statically
allocated variables are incompatible with reentrancy, and we're in the
process of eliminating all of them.

<li>Do not use <b><tt>extern</tt></b> in <b><tt>.c</tt></b> files, only in
<b><tt>.h</tt></b> files, unless you have a very good reason for it (e.g.,
as in <a href="../src/iconf.c">iconf.c</a>).  There are too many such
<b><tt>extern</tt></b>s in the code now: we are eliminating them over time.

<li>Do not declare the same name as both <b><tt>static</tt></b>
(<b><tt>private</tt></b>) and non-<b><tt>static</tt></b> within the same
compilation.  (Some compilers complain, some do not.)  This is especially a
problem for procedures: it is easy to declare a procedure as
<b><tt>private</tt></b> near the beginning of a file and accidentally not
declare it <b><tt>private</tt></b> where it is defined later in the file.

<li>Even though the ANSI standard allows initialized external declarations
(<b><tt>extern&nbsp;int&nbsp;x&nbsp;=&nbsp;0</tt></b>), don't use them.

</ul>

<h3><a name="Scalars"></a>Scalars</h3>

<p>
Restrictions:

<ul>

<li>Avoid using <b><tt>char</tt></b>, except for <b><tt>char&nbsp;*</tt></b>
for a pointer to a string.  Don't assume that <b><tt>char</tt></b> is
signed; also don't assume it is unsigned.

<li>Never cast a <b><tt>float</tt></b> to a <b><tt>double</tt></b>
explicitly.  ANSI compilers in their default mode do all floating point
computations in double precision, and handle such casts automatically.

<li>Don't use <b><tt>long long</tt></b>: even though it is in the ANSI
standard, not all compilers support it.  Use <b><tt>bits64</tt></b> instead
(see below under "<a href="#Language_extensions">Language extensions</a>").

<li>Don't assume anything about whether <b><tt>sizeof(long)</tt></b> is less
than, equal to, or greater than <b><tt>sizeof(ptr)</tt></b>.  (However, you
can make such comparisons in preprocessor conditionals using
<b><tt>ARCH_SIZEOF_LONG</tt></b> and <b><tt>ARCH_SIZEOF_PTR</tt></b>.)

</ul>

<h3><a name="Arrays"></a>Arrays</h3>

<p>
Restrictions:

<ul>

<li>Don't declare arrays of size 0.  (The newer ANSI standard allows this,
but the older one doesn't.)

<li>Don't declare an array of size 1 at the end of a structure to indicate
that a variable-size array follows.

<li>Don't declare initialized <b><tt>auto</tt></b> arrays.

</ul>

<h3><a name="Typedefs"></a>Typedefs</h3>

<p>
Restrictions:

<ul>

<li>Don't use <b><tt>typedef</tt></b> for function types, such as

<blockquote>
<b><tt>typedef int proc_xyz_t(double, int *);</tt></b>
</blockquote>

<p>Many compilers don't handle this correctly -- they will give errors, or
do the wrong thing, when declaring variables of type
<b><tt>proc_xyz_t</tt></b> and/or <b><tt>proc_xyz_t *</tt></b>.  Instead, do
this:

<blockquote>
<b><tt>#define PROC_XYZ(proc) int proc(double, int *)<br>
PROC_XYZ(some_proc);  /* declare a procedure of this type */<br>
typedef PROC_XYZ((*proc_xyz_ptr_t));  /* define a type for procedure ptrs */<br>
<br>
proc_xyz_ptr_t pp;  /* pointer to procedure */</tt></b>
</blockquote>

<li>Don't redefine <b><tt>typedef</tt></b>'ed names, even with the same
definition.  Some compilers complain about this, and the standard doesn't
allow it.

</ul>

<h3><a name="Structures"></a>Structures</h3>

<p>
Restrictions:

<ul>

<li>Don't use anonymous structures if you can possibly avoid it, except
occasionally as components of other structures. Ideally, use the
<b><tt>struct</tt></b> keyword only for declaring named structure types,
like this:

<blockquote>
<b><tt>typedef struct xxx_s {</tt></b><br>
&nbsp;&nbsp;&nbsp;... members ...<br>
<b><tt>} xxx_t;</tt></b>
</blockquote>

<li>Use <b><tt>struct</tt></b> only when declaring structure types, never
for referring to them (e.g., never declare a variable as type
<b><tt>struct&nbsp;xxx_s&nbsp;*</tt></b>).

<li>Don't assume that the compiler will (or won't) insert padding in
structures to align members for best performance.  To preserve alignment,
only declare structure members that are narrower than an <b><tt>int</tt></b>
if there will be a lot of instances of that structure in memory.  For such
structures, insert <b><tt>byte</tt></b> and/or <b><tt>short</tt></b> padding
members as necessary to re-establish <b><tt>int</tt></b> alignment.

<li>Don't declare initialized <b><tt>auto</tt></b> structures.

</ul>

<h3><a name="Unions"></a>Unions</h3>

<p>
Restrictions:

<ul>

<li>Use unions only as components of structures, not as typedefs in their
own right.

<li>Don't attempt to initialize unions: not all compilers support this, even
though it is in the 1989 ANSI standard.

</ul>

<h3><a name="Expressions"></a>Expressions</h3>

<p>
Restrictions:

<ul>

<li>Don't assign a larger integer data type to a smaller one without a cast
(<b><tt>int_x&nbsp;=&nbsp;long_y</tt></b>).

<li>It's OK to use the address of a structure or array element
(<b><tt>&p->e</tt></b>, <b><tt>&a[i]</tt></b>) locally, or pass it to a
procedure that won't store it, but don't store such an address in allocated
storage unless you're very sure of what you're doing.

<li>Don't use conditional expressions with structure or union values.
(Pointers to structures or unions are OK.)

<li>For calling a variable or parameter procedure, use
<b><tt>ptr-&gt;func(...)</tt></b>.  Some old code uses explicit indirection,
<b><tt>(*ptr-&gt;func)(...)</tt></b>: don't use this in new code.

<li>Don't write expressions that depend on order of evaluation, unless the
order is created explicitly by use of <b><tt>||</tt></b>,
<b><tt>&amp;&amp;</tt></b>, <b><tt>?:</tt></b>, <b><tt>,</tt></b>, or
function nesting (the arguments of a function must be evaluated before the
function is called).  In particular, don't assume that the arguments of a
function will be evaluated left-to-right, or that the left side of an
assignment will be evaluated before the right.

<li>Don't mix integer and enumerated types ad lib: treat enumerated types as
distinct from integer types, and use casts to convert between the two.
(Some compilers generate warnings if you do not do this.)

</ul>

<h3><a name="Statements"></a>Statements</h3>

<p>
Restrictions:

<ul>

<li>If you use an expression as a statement, other than an assignment or a
function call with <b><tt>void</tt></b> return value, enclose it explicitly
in <b><tt>DISCARD()</tt></b>.

<li>The type of the operand of a <b><tt>switch</tt></b> must match the type
of the case labels, whether the labels are <b><tt>int</tt></b>s or the
members of an <b><tt>enum</tt></b> type.  (Use a cast if necessary.)

<li>It is OK for one case of a switch to "fall through" into another (i.e.,
for the statement just before a case label not to be a control transfer),
but a comment <b><tt>/*&nbsp;falls&nbsp;through&nbsp;*/</tt></b> is
required.

<li>If you are returning an error code specified explicitly (e.g.,
<b><tt>return&nbsp;gs_error_rangecheck</tt></b> or
<b><tt>return&nbsp;e_rangecheck</tt></b>), use
<b><tt>return_error()</tt></b> rather than plain <b><tt>return</tt></b>.
However, if the program is simply propagating an error code generated
elsewhere, as opposed to generating the error, use <b><tt>return</tt></b>
(e.g., <b><tt>if&nbsp;(code&nbsp;<&nbsp;0)&nbsp;return&nbsp;code</tt></b>).

</ul>

<h3><a name="Procedures"></a>Procedures</h3>

<p>
Restrictions:

<ul>

<li>Provide a prototype for every procedure, and make sure the prototype is
available at every call site.  If the procedure is local to a file
(<b><tt>private</tt></b>), the prototype should precede the procedure, in
the same file; if the procedure is global, the prototype should be in a
header file.

<li>If a procedure parameter is itself a procedure, do list its parameter
types rather than just using <b><tt>()</tt></b>.  For example,

<blockquote><b><tt>
int foo(int (*callback)(int, int));
</tt></b></blockquote>

<p>
rather than just

<blockquote><b><tt>
int foo(int (*callback)());
</tt></b></blockquote>

<li>Don't use the <b><tt>P</tt></b>* macros in new code.  (See the
Procedures section of <a href="#Language_extensions">Language extensions</a>
below for more information.)

<li>Always provide an explicit return type for procedures, in both the
prototype and the definition: don't rely on the implicit declaration as
<b><tt>int</tt></b>.

<li>Don't use <b><tt>float</tt></b> as the return type of a procedure,
unless there's a special reason.  Floating point hardware typically does
everything in double precision internally and has to do extra work to
convert between double and single precision.

<li>Don't declare parameters as being of type <b><tt>float</tt></b>,
<b><tt>short</tt></b>, or <b><tt>char</tt></b>.  If you do this and forget
to include the prototype at a call site, ANSI compilers will generate
incompatible calling sequences.  Use <b><tt>floatp</tt></b> (a synonym for
<b><tt>double</tt></b>, mnemonic for "float parameter") instead of
<b><tt>float</tt></b>, and use <b><tt>int</tt></b> or <b><tt>uint</tt></b>
instead of <b><tt>short</tt></b> or <b><tt>char</tt></b>.

</ul>

<h3><a name="Standard_library"></a>Standard library</h3>

<p>
Restrictions:

<ul>

<li>Only use library features that are documented in the established ANSI
standard (e.g., Harbison & Steele's book).  Do not use procedures that are
"standards" promulgated by Microsoft (e.g., <b><tt>stricmp</tt></b>), or
originate in BSD Unix (e.g., <b><tt>strcasecmp</tt></b>), or were added in
later versions of the standard such as C 9X.

<li>Do not use any features from <b><tt>stdio.h</tt></b> that assume the
existence of <b><tt>stdin</tt></b>, <b><tt>stdout</tt></b>, or
<b><tt>stderr</tt></b>.  See <a href="../src/gsio.h">gsio.h</a> for the full
list.  Instead, use <b><tt>gs_stdin</tt></b> et al.

</ul>

<hr>

<h2><a name="Language_extensions"></a>Language extensions</h2>

<h3>Scoping</h3>

<dl>

<dt><b><tt>inline</tt></b>

<dd><b><tt>inline</tt></b> is available even if the compiler does not
support it.  Be aware, however, that it may have no effect.  In particular,
do not use <b><tt>inline</tt></b> in header files.  Instead, use the
<b><tt>extern_inline</tt></b> facility described just below.

<dt><b><tt>extern_inline</tt></b>

<dd>Compilers that do support <b><tt>inline</tt></b> vary in how they decide
whether to (also) compile a closed-code copy of the procedure.  Because of
this, putting an <b><tt>inline</tt></b> procedure in a header file may
produce multiple closed copies, causing duplicate name errors at link time.
<b><tt>extern_inline</tt></b> provides a safe way to put
<b><tt>inline</tt></b> procedures in header files, regardless of compiler.
Unfortunately, the only way we've found to make this fully portable involves
a fair amount of boilerplate.  For details, please see <a
href="../src/stdpre.h">stdpre.h</a>.

<dt><b><tt>private</tt></b>

<dd><b>Use <tt>private</tt></b> instead of <b><tt>static</tt></b> for all
file-local procedures, and also for file-local variables defined at the
outermost level.  However, use <b><tt>static</tt></b>, not
<b><tt>private</tt></b>, for variables defined within a procedure.

<p>
<b><tt>private</tt></b> is normally #define'd as <b><tt>static</tt></b>.
However, it can also be #define'd as empty, which allows profilers to
measure all procedures, and 'nm' to list all interesting statically
allocated variables, not just public ones.

</dl>

<h3>Scalar types</h3>

<dl>

<dt><b><tt>bool, true, false</tt></b>

<dd><b><tt>bool</tt></b> is intended as a Boolean type, with canonical
values <b><tt>true</tt></b> and <b><tt>false</tt></b>.  In a more reasonable
language, such as Java, <b><tt>bool</tt></b> is an enumerated type requiring
an explicit cast to or from <b><tt>int</tt></b>; however, because C's
conditionals are defined as producing <b><tt>int</tt></b> values, we can't
even define <b><tt>bool</tt></b> as a C <b><tt>enum</tt></b> without
provoking compiler warnings.

<p>
Even though <b><tt>bool</tt></b> is a synonym for <b><tt>int</tt></b>, treat
them as conceptually different types:

<ul>
<li>Initialize or set <b><tt>bool</tt></b> variables to <b><tt>true</tt></b>
or <b><tt>false</tt></b>, not 0 or 1.
<li>Use the Boolean operators <b><tt>!</tt></b>, <b><tt>&&</tt></b>,
and <b><tt>||</tt></b> only with Booleans.  Don't use the idiom
<b><tt>!!x</tt></b> to create a Boolean that is true iff <b><tt>x</tt></b>
!= 0: use <b><tt>x != 0</tt></b>.
<li>Use an explicit <b><tt>(int)</tt></b> cast to convert a Boolean to an
integer.
</ul>

<dt><b><tt>byte, ushort, uint, ulong</tt></b>

<dd>These types are simply shorthands for <b><tt>unsigned char, short, int,
long</tt></b>.

<p>
In addition, the use of <b><tt>byte *</tt></b> indicates a
Ghostscript-style string, with explicit length given separately, as
opposed to a null terminated C-style string, which is <b><tt>char
*</tt></b>.

<dt><b><tt>floatp</tt></b>

<dd>This is a synonym for <b><tt>double</tt></b>.  It should be used for,
and only for, procedure parameters that would otherwise be
<b><tt>float</tt></b>.  (As noted above, procedure parameters should not be
declared as <b><tt>float</tt></b>.)

<dt><b><tt>bits8, bits16, bits32</tt></b>

<dd>These are unsigned integer types of the given width.  Use them wherever
the actual width matters: do <em>not</em>, for example, use
<b><tt>short</tt></b> assuming that it is 16 bits wide.

<dt><b><tt>bits64</tt></b>

<dd><strong>****** NOT IMPLEMENTED YET ******</strong>
This is an unsigned 64-bit integer type, but it may not be available on all
platforms.  Any code that uses this type should be surrounded by
<b><tt>#if&nbsp;ARCH_HAS_BITS64</tt></b>.

</dl>

<hr>

<h2><a name="Stylistic_conventions"></a>Stylistic conventions</h2>

<p>
Ghostscript's coding rules cover not only the use of the language, but also
many stylistic issues like the choice of names and the use of whitespace.
The stylistic rules are meant to produce code that is easy to read.  It's
important to observe them as much as possible in order to maintain a
consistent style, but if you find these rules getting in your way or
producing ugly-looking results once in a while, it's OK to break it.

<h3><a name="Formatting"></a>Formatting</h3>

<h4><a name="Indentation"></a>Indentation</h4>

<p>
We've formatted all of our code using the GNU <b><tt>indent</tt></b> program.

<blockquote><b><tt>
indent&nbsp;-bad&nbsp;-nbap&nbsp;-nsob&nbsp;-br&nbsp;-ce&nbsp;-cli4&nbsp;-npcs&nbsp;-ncs&nbsp;\<br>
&nbsp;&nbsp;&nbsp;-i4&nbsp;-di0&nbsp;-psl&nbsp;-lp&nbsp;-lps&nbsp;somefile.c
</tt></b></blockquote>

<p>
does a 98% accurate job of producing our preferred style.  Unfortunately,
there are bugs in all versions of GNU <b><tt>indent</tt></b>, requiring
both pre- and post-processing of the code.  The <b><tt>gsindent</tt></b>
script in the Ghostscript fileset contains the necessary workarounds.

<p>
Put indentation points every 4 spaces, with 8 spaces = 1 tab stop.
  
<p>
Don't indent the initial <b><tt>#</tt></b> of preprocessor commands.
However, for nested preprocessor commands, do use indentation between the
<b><tt>#</tt></b> and the command itself.  Use 2 spaces per level of
nesting, e.g.:

<blockquote>
<b><tt>#ifndef&nbsp;xyz</tt></b><br>
<b><tt>#&nbsp;&nbsp;define&nbsp;xyz&nbsp;0</tt></b><br>
<b><tt>#endif</tt></b>
</blockquote>

<p>
For assignments (including chain assignments), put the entire statement on
one line if it will fit; if not, break it after a <b><tt>=</tt></b> and
indent all the following lines.  I.e., format like this:

<blockquote>
var1&nbsp;<b><tt>=</tt></b>&nbsp;value<b><tt>;</tt></b><br>
var1&nbsp;<b><tt>=</tt></b>&nbsp;var2&nbsp;<b><tt>=</tt></b>&nbsp;value<b><tt>;</tt></b><br>
var1&nbsp;<b><tt>=</tt></b><br>
&nbsp;&nbsp;&nbsp;&nbsp;value<b><tt>;</tt></b><br>
var1&nbsp;<b><tt>=</tt></b><br>
&nbsp;&nbsp;&nbsp;&nbsp;var2&nbsp;<b><tt>=</tt></b>&nbsp;value<b><tt>;</tt></b><br>
var1&nbsp;<b><tt>=</tt></b>&nbsp;var2&nbsp;<b><tt>=</tt></b><br>
&nbsp;&nbsp;&nbsp;&nbsp;value<b><tt>;</tt></b>
</blockquote>

<p>
But not like this:

<blockquote>
var1&nbsp;<b><tt>=</tt></b><br>
var2&nbsp;<b><tt>=</tt></b> value<b><tt>;</tt></b>
</blockquote>

<p>
Indent in-line blocks thus:

<blockquote>
<b><tt>{</tt></b><br>
&nbsp;&nbsp;&nbsp;... declarations ...<br>
&nbsp;&nbsp;&nbsp;{{ blank line if any declarations above }}<br>
&nbsp;&nbsp;&nbsp;... statements ...<br>
<b><tt>}</tt></b>
</blockquote>

<p>
Similarly, indent procedures thus:

<blockquote>
return_type<br>
proc_name(... arguments ...)<br>
<b><tt>{</tt></b><br>
&nbsp;&nbsp;&nbsp;... declarations ...<br>
&nbsp;&nbsp;&nbsp;{{ blank line if any declarations above }}<br>
&nbsp;&nbsp;&nbsp;... statements ...<br>
<b><tt>}</tt></b>
</blockquote>

<p>
If a control construct (<b><tt>if</tt></b>, <b><tt>do</tt></b>,
<b><tt>while</tt></b>, or <b><tt>for</tt></b>) has a one-line body, use
this:

<blockquote>
... control construct ...<br>
&nbsp;&nbsp;&nbsp;... subordinate simple statement ...
</blockquote>

<p>
If it has a multi-line body, use this:

<blockquote>
... control construct ... <b><tt>{</tt></b><br>
&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>}</tt></b>
</blockquote>

<p>
If the subordinate code has declarations, see blocks above.

<p>
For if-else statements, do this:

<blockquote>
<b><tt>if (</tt></b> ...<b><tt> ) {</tt></b><br>
&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>} else if (</tt></b> ...<b><tt> ) {</tt></b><br>
&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>} else {</tt></b><br>
&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>}</tt></b>
</blockquote>

<p>
When there are more than two alternatives, as in the example above, use the
above ("parallel") syntax rather than the following ("nested") syntax:

<blockquote>
<b><tt>if (</tt></b> ...<b><tt> ) {</tt></b><br>
&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>} else {</tt></b><br>
<b><tt>&nbsp;&nbsp;&nbsp;if (</tt></b> ...<b><tt> ) {</tt></b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>&nbsp;&nbsp;&nbsp;} else {</tt></b><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... subordinate code ...<br>
<b><tt>&nbsp;&nbsp;&nbsp;}</tt></b><br>
<b><tt>}</tt></b>
</blockquote>

<p>
Similarly, for do-while statements, do this:

<blockquote>
<b><tt>do {</tt></b><br>
&nbsp;&nbsp;&nbsp;... body ...<br>
<b><tt>} while (</tt></b> ... condition ... <b><tt>);</tt></b>
</blockquote>

<h4><a name="Spaces"></a>Spaces</h4>

<p>
Do put a space:
<ul>
<li>after every comma and semicolon, unless it ends a line;
<li>around every binary operator other than "<b><tt>-&gt;</tt></b>" and
"<b><tt>.</tt></b>", although you can omit the spaces around the innermost
operator in a nested expression if you like;
<li>on both sides of the parentheses of an <b><tt>if</tt></b>, <b><tt>for</tt></b>, or <b><tt>while</tt></b>.
</ul>

<p>
Don't put a space:
<ul>
<li>at the end of a line;
<li>before a comma or semicolon;
<li>after unary prefix operators;
<li>before the parenthesis of a macro or procedure call.
</ul>

<h4><a name="Parentheses"></a>Parentheses</h4>

<p>
Parentheses are important in only a few places:

<ul>
<li>Around the inner subexpressions in expressions that mix
<b><tt>&amp;&amp;</tt></b> and <b><tt>||</tt></b>, even if they are not
required by precedence, for example

<blockquote><b><tt>
(xx &amp;&amp; yy) || zz
</tt></b></blockquote>

<li>Similarly around inner subexpressions in expressions that mix
<b><tt>&amp;</tt></b>, <b><tt>|</tt></b>, or shifts, especially if mixing
these with other operators, for instance

<blockquote><b><tt>
(x &lt;&lt; 3) | (y &gt;&gt; 5)
</tt></b></blockquote>

<li>In macro definitions around every use of an argument that logically
could be an expression, for example

<blockquote><b><tt>
((x) * (x) + (y) * (y))
</tt></b></blockquote>

</ul>

<p>
Anywhere else, given the choice, use fewer parentheses.

<p>
For stylistic consistency with the existing Ghostscript code, put
parentheses around conditional expressions even if they aren't
syntactically required, unless you really dislike doing this.  Note that
the parentheses should go around the entire expression, not the condition.
For instance, instead of

<blockquote><b><tt>
hpgl_add_point_to_path(pgls, arccoord_x, arccoord_y,<br>
&nbsp;&nbsp;&nbsp;(pgls-&gt;g.pen_down) ? gs_lineto : gs_moveto);
</tt></b></blockquote>

<p>
use

<blockquote><b><tt>
hpgl_add_point_to_path(pgls, arccoord_x, arccoord_y,<br>
&nbsp;&nbsp;&nbsp;(pgls-&gt;g.pen_down ? gs_lineto : gs_moveto));
</tt></b></blockquote>

<h3><a name="Preprocessor_style"></a>Preprocessor</h3>

<h4>Conditionals</h4>

<p>
Using preprocessor conditionals can easily lead to unreadable code, since
the eye really wants to read linearly rather than having to parse the
conditionals just to figure out what code is relevant.  It's OK to use
conditionals that have small scope and that don't change the structure or
logic of the program (typically, they select between different sets of
values depending on some configuration parameter), but where possible, break
up source modules rather than use conditionals that affect the structure or
logic.

<h4>Macros</h4>

<p>
Ghostscript code uses macros heavily to effectively extend the rather
weak abstraction capabilities of the C language, specifically in the area of
memory management and garbage collection: in order to read Ghostscript code
effectively, you simply have to learn some of these macros as though they
were part of the language.  The current code also uses macros heavily for
other purposes, but we are trying to phase these out as rapidly as possible,
because they make the code harder to read and debug, and to use the
rules that follow consistently in new code.

<p>
Define macros in the smallest scope you can manage (procedure, file, or
<b><tt>.h</tt></b> file), and <b><tt>#undef</tt></b> them at the end of
that scope: that way, someone reading the code can see the definitions
easily when reading the uses.  If that isn't appropriate, define them in as
large a scope as possible, so that they effectively become part of the
language.  This places an additional burden on the reader, but it can be
amortized over reading larger amounts of code.

<p>
Try hard to use procedures instead of macros.  Use "<b><tt>inline</tt></b>"
if you really think the extra speed is needed, but only within a
<b><tt>.c</tt></b> file: don't put inline procedures in <b><tt>.h</tt></b>
files, because most compilers don't honor "<b><tt>inline</tt></b>" and
you'll wind up with a copy of the procedure in every <b><tt>.c</tt></b>
file that includes the <b><tt>.h</tt></b> file.

<p>
If you define a macro that looks like a procedure, make sure it will work
wherever a procedure will work.  In particular, put parentheses around every
use of an argument within the macro body, so that the macro will parse
correctly if some of the arguments are expressions, and put parentheses
around the entire macro body.  (This is still subject to the problem that an
argument may be evaluated more than once, but there is no way around this in
C, since C doesn't provide for local variables within expressions.)

<p>
If you define macros for special loop control structures, make their uses
look somewhat like ordinary loops, for instance:

<blockquote>
<b><tt>BEGIN_RECT(xx, yy) {</tt></b><br>
&nbsp;&nbsp;... body indented one position ...<br>
<b><tt>} END_RECT(xx, yy);</tt></b>
</blockquote>

<p>
If at all possible, don't use free variables in macros -- that is, variables
that aren't apparent as arguments of the macro.  If you must use free
variables, list them all in a comment at the point where the macro is
defined.

<p>
If you define new macros or groups of macros, especially if they aren't
simply inline procedures or named constant values, put some extra effort
into documenting them, to compensate for the fact that macros are
intrinsically harder to understand than procedures.

<h3><a name="Comments"></a>Comments</h3>

<p>
The most important descriptive comments are ones in header files that
describe structures, including invariants; but every procedure or structure
declaration, or group of other declarations, should have a comment.  Don't
spend a lot of time commenting executable code unless something unusual or
subtle is going on.

<h3><a name="Naming"></a>Naming</h3>

<p>
Use fully spelled-out English words in names, rather than contractions.
This is most important for procedure and macro names, global variables and
constants, values of <b><tt>#define</tt></b> and <b><tt>enum</tt></b>,
<b><tt>struct</tt></b> and other <b><tt>typedef</tt></b> names, and
structure member names, and for argument and variable names which have
uninformative types like <b><tt>int</tt></b>.  It's not very important for
arguments or local variables of distinctive types, or for local index or
count variables.

<p>
Avoid names that run English words together:
"<b><tt>hpgl_compute_arc_center</tt></b>" is better than
"<b><tt>hpgl_compute_arccenter</tt></b>".  However, for terms drawn from
some predefined source, like the names of PostScript operators, use a term
in its well-known form (for instance, <b><tt>gs_setlinewidth</tt></b>
rather than <b><tt>gs_set_line_width</tt></b>).

<p>
Procedures, variables, and structures visible outside a single
<b><tt>.c</tt></b> file should generally have prefixes that indicate what
subsystem they belong to (in the case of Ghostscript, <b><tt>gs_</tt></b>
or <b><tt>gx_</tt></b>).  This rule isn't followed very consistently.

<h3><a name="Types"></a>Types</h3>

<p>
Many older structure names don't have <b><tt>_t</tt></b> on the end, but
this suffix should be used in all new code.  (The <b><tt>_s</tt></b>
structure name is needed only to satisfy some debuggers.  No code other than
the structure declaration should refer to it.)

<p>
Declare structure types that contain pointers to other instances of
themselves like this:

<blockquote>
<b><tt>typedef struct xxx_s xxx_t;</tt></b><br>
<b><tt>struct xxx_s {</tt></b><br>
&nbsp;&nbsp;&nbsp;... members ...<br>
&nbsp;&nbsp;&nbsp;<b><tt>xxx_t *</tt></b>ptr_member_name;<br>
&nbsp;&nbsp;&nbsp;... members ...<br>
<b><tt>};</tt></b>
</blockquote>

<p>
If, to maintain data abstraction and avoid including otherwise unnecessary
header files, you find that you want the type <b><tt>xxx_t</tt></b> to be
available in a header file that doesn't include the definition of the
structure <b><tt>xxx_s</tt></b>, use this approach:

<blockquote>
<b><tt>#ifndef xxx_DEFINED</tt></b><br>
<b><tt>#&nbsp;&nbsp;define xxx_DEFINED</tt></b><br>
<b><tt>typedef struct xxx_s xxx_t;</tt></b><br>
<b><tt>#endif</tt></b><br>
<b><tt>struct xxx_s {</tt></b><br>
&nbsp;&nbsp;&nbsp;... members ...<br>
<b><tt>};</tt></b>
</blockquote>

<p>
You can then copy the first 4 lines in other header files.  (Don't ever
include them in an executable code file.)

<p>
Don't bother using <b><tt>const</tt></b> for anything other than with
pointers as described below.  However, in those places where it is necessary
to cast a pointer of type <b><tt>const&nbsp;T&nbsp;*</tt></b> to type
<b><tt>T&nbsp;*</tt></b>, always include a comment that explains why you are
"breaking const".

<h4>Pointers</h4>

<p>
Use <b><tt>const</tt></b> for pointer referents (that is,
<b><tt>const&nbsp;T&nbsp;*</tt></b>) wherever possible and appropriate.

<p>
If you find yourself wanting to use <b><tt>void&nbsp;*</tt></b>, try to
find an alternative using unions or (in the case of super- and subclasses)
casts, unless you're writing something like a memory manager that really
treats memory as opaque.

<h3><a name="Procedures_style"></a>Procedures</h3>

<p>
In general, don't create procedures that are private and only called from
one place.  However, if a compound statement (especially an arm of a
conditional) is too long for the eye easily to match its enclosing braces
"<b><tt>{...}</tt></b>" -- that is, longer than 10 or 15 lines -- and it
doesn't use or set a lot of state held in outer local variables, it may be
more readable if you put it in a procedure.

<h3>Miscellany</h3>

<h4><a name="Local_variables"></a>Local variables</h4>

<p>
Don't assign new values to procedure parameters.  It makes debugging very
confusing when the parameter values printed for a procedure are not the
ones actually supplied by the caller.  Instead use a separate local
variable initialized to the value of the parameter.

<p>
If a local variable is only assigned a value once, assign it that value at
its declaration, if possible.  For example,

<blockquote>
<b><tt>int x = </tt></b>some expression <b><tt>;</tt></b>
</blockquote>

<p>
rather than

<blockquote>
<b><tt>int x;</tt></b><br>
...<br>
<b><tt>x = </tt></b> some expression <b><tt>;</tt></b>
</blockquote>

<p>
Use a local pointer variable like this to "narrow" pointer types:

<blockquote>
<b><tt>int</tt></b><br>
someproc(... <b><tt>gx_device *dev</tt></b> ...)<br>
<b><tt>{<br>
&nbsp;&nbsp;&nbsp;gx_device_printer *const pdev = (gx_device_printer *)dev;</tt></b><br>
&nbsp;&nbsp;&nbsp;...<br>
<b><tt>}</tt></b>
</blockquote>

<p>
Don't "shadow" a local variable or procedure parameter with an inner local
variable of the same name.  I.e., don't do this:

<blockquote>
<b><tt>int</tt></b><br>
someproc(... <b><tt>int x</tt></b> ...)<br>
<b><tt>{</tt></b><br>
&nbsp;&nbsp;&nbsp;...<br>
<b><tt>&nbsp;&nbsp;&nbsp;int x;</tt></b><br>
&nbsp;&nbsp;&nbsp;...<br>
<b><tt>}</tt></b>
</blockquote>

<h4><a name="Compiler_warnings"></a>Compiler warnings</h4>

<p>
The following section refers to the warnings produced by <b><tt>gcc</tt></b>:
your compiler may produce different ones.

<p>
It's OK if compilation produces the following warnings:

<ul>
<li><b><tt>&lt;name&gt; might be used uninitialized in this function</tt></b>
<li><b><tt>cast discards `const' from pointer target type</tt></b>
</ul>

<p>
The first of these often occurs because the compiler isn't aware of control
flow restrictions that guarantee the variable will be initialized before
use: if it occurs in new code, check the code carefully, but don't worry
about the message.  The second is often unavoidable in code that initializes
or frees a structure that is otherwise <b><tt>const</tt></b> during its
lifetime.
<p>

Do work hard to eliminate all warnings other than these,
since they often indicate the possible presence of coding errors.
In particular, get rid of warnings about parameter passing or
initialization that discards <b><tt>const</tt></b>,
by using explicit casts.

<hr>

<h2><a name="File_structuring"></a>File structuring</h2>

<h3><a name="All_files"></a>All files</h3>

<p>
Keep file names within the "8.3" format for portability:
<ul>
<li>Use only letters, digits, dash, and underscore in file names.
<li>Don't assume upper and lower case letters are distinct.
<li>Put no more than 8 characters before the ".", if any.
<li>If there is a ".", put between 1 and 3 characters after the ".".
</ul>

<p>
For files other than documentation files, use only lower case letters
in the names; for HTML documentation files, capitalize the first letter.

<p>
Every code file should start with comments containing

<ol>
<li>a copyright notice,
<li>the name of the file in the form of an RCS Id:

<blockquote><b><tt>
/* $<!-- -->Id: filename.ext $*/
</tt></b></blockquote>

<p>
(using the comment convention appropriate to the language of the file), and

<li>a summary, no more than one line, of what the file contains.
</ol>

<p>
If you create a file by copying the beginning of another file, be sure to
update the copyright year and change the file name.

<h3><a name="Makefiles"></a>Makefiles</h3>

<p>
Use the extension <b><tt>.mak</tt></b> for makefiles.

<p>
For each

<blockquote><b><tt>
#include "xxx.h"
</tt></b></blockquote>

<p>
make sure there is a dependency on <b><tt>$(xxx_h)</tt></b> in the
makefile.  If xxx ends with a "<b><tt>_</tt></b>", this rule still holds,
so that if you code

<blockquote><b><tt>
#include "math_.h"
</tt></b></blockquote>

<p>
the makefile must contain a dependency on "<b><tt>$(math__h)</tt></b>"
(note the two underscores "<b><tt>__</tt></b>").

<p>
List the dependencies bottom-to-top, like the <b><tt>#include</tt></b>
statements themselves; within each level, list them alphabetically.  Do
this also with <b><tt>#include</tt></b> statements themselves whenever
possible (but sometimes there are inter-header dependencies that require
bending this rule).

<p>
For compatibility with the build utilities on OpenVMS, always put a space
before the colon that separates the target(s) of a rule from the dependents.

<h3><a name="General_C_code"></a>General C code</h3>

<p>
List <b><tt>#include</tt></b> statements from "bottom" to "top", that is,
in the following order:

<blockquote><ol>
<li>System includes (<b><tt>"xxx_.h"</tt></b>)
<li><b><tt>gs*.h</tt></b>
<li><b><tt>gx*.h</tt></b> (yes, <b><tt>gs</tt></b> and <b><tt>gx</tt></b>
are in the wrong order.)
<li><b><tt>s*.h</tt></b>
<li><b><tt>i*.h</tt></b> (or other interpreter headers that don't start
with "<b><tt>i</tt></b>")
</ol></blockquote>

<h3><a name="Headers"></a>Headers (<b><tt>.h</tt></b> files)</h3>

<p>
In header files, always use the following at the beginning of a header file
to prevent double inclusion:

<blockquote>
{{ Copyright notice etc. }}<br><br>

<b><tt>#ifndef </tt></b>&lt;filename&gt;<b><tt>_INCLUDED</tt></b><br>
<b><tt>#define </tt></b>&lt;filename&gt;<b><tt>_INCLUDED</tt></b><br><br>

{{ The contents of the file }}<br><br>

<b><tt>#endif /* </tt></b>&lt;filename&gt;<b><tt>_INCLUDED */</tt></b>
</blockquote>

<p>
The header file is the first place that a reader goes for
information about procedures, structures, constants, etc., so ensure that
every procedure and structure has a comment that says what it does.  Divide
procedures into meaningful groups set off by some distinguished form of
comment.

<h3><a name="Source"></a>Source (<b><tt>.c</tt></b> files)</h3>

<p>
After the initial comments, arrange C files in the following order:

<blockquote><ol>
<li><b><tt>#include</tt></b> statements
<li>Exported data declarations
<li>Explicit externs (if necessary)
<li>Forward declarations of procedures
<li>Private data declarations
<li>Exported procedures
<li>Private procedures
</ol></blockquote>

<p>
Be flexible about the order of the declarations if necessary to improve
readability.  Many older files don't follow this order, often without good
reason.

<hr>

<h2><a name="Conventions"></a>Ghostscript conventions</h2>

<h3><a name="Specific_names"></a>Specific names</h3>

<p>
The Ghostscript code uses certain names consistently for certain kinds of
values.  Some of the commonest and least obvious are these two:

<h4><a name="code"></a><b><tt>code</tt></b></h4>

<blockquote>
A value to be returned from a procedure:

<table cellpadding=0 cellspacing=0>
<tr valign=top>	<td align=right>&lt; 0
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
	<td>An error code defined in
<a href="../src/gserrors.h">gserrors.h</a>
(or <a href="../src/ierrors.h">ierrors.h</a>)
<tr valign=top>	<td align=right>0
	<td>&nbsp;
	<td>Normal return
<tr valign=top>	<td align=right>&gt; 0
	<td>&nbsp;
	<td>A non-standard but successful return (which must be documented, preferably with the procedure's prototype)
</table>

</blockquote>

<h4><a name="status"></a><b><tt>status</tt></b></h4>

<blockquote>
A value returned from a stream procedure:

<table cellpadding=0 cellspacing=0>
<tr valign=top>	<td align=right>&lt; 0
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
	<td>An exceptional condition as defined in
<a href="../src/scommon.h">scommon.h</a>
<tr valign=top>	<td align=right>0
	<td>&nbsp;
	<td>Normal return (or, from the "<b><tt>process</tt></b>" procedure, means that more input is needed)
<tr valign=top>	<td align=right>1
	<td>&nbsp;
	<td>More output space is needed (from the "<b><tt>process</tt></b>" procedure)
</table>
</blockquote>

<h3><a name="Structure_type_descriptors"></a>Structure type descriptors</h3>

<p>
The Ghostscript memory manager requires run-time type information for every
structure.  (We don't document this in detail here: see the <a
href="Develop.htm#Structure_descriptors">Structure descriptors</a> section
of the developer documentation for details.)  Putting the descriptor for a
structure next to the structure definition will help keep the two
consistent, so immediately after the definition of a structure
<b><tt>xxx_s</tt></b>, define its structure descriptor:

<blockquote>
<b><tt>struct xxx_s {</tt></b><br>
&nbsp;&nbsp;&nbsp;... members ...<br>
<b><tt>};</tt></b><br>
<b><tt>#define private_st_xxx()&nbsp;&nbsp;/* in </tt></b>&lt;filename&gt;<tt><b>.c */\</tt></b><br>
<b><tt>&nbsp;&nbsp;gs_private_st_</tt></b>&lt;whatever&gt;<b><tt>(st_xxx, xxx_t,\</tt></b><br>
<b><tt>&nbsp;&nbsp;&nbsp;&nbsp;"xxx_t", xxx_enum_ptrs, xxx_reloc_ptrs,\</tt></b><br>
<b><tt>&nbsp;&nbsp;&nbsp;&nbsp;</tt></b>... additional parameters as needed ...<b><tt>)</tt></b>
</blockquote>

<p>
The file that implements operations on this structure
(&lt;filename&gt;<b><tt>.c</tt></b>) should then include, near the
beginning, the line:

<blockquote>
<b><tt>private_st_xxx();</tt></b>
</blockquote>

<p>
In much existing code, structure descriptors are declared as
<b><tt>public</tt></b>, which allows clients to allocate instances of the
structure directly.  We now consider this bad design.  Instead, structure
descriptors should always be <b><tt>private</tt></b>; the implementation
file should provide one or more procedures for allocating instances, e.g.,

<blockquote>
<b><tt>xxx_t *gs_xxx_alloc(P1(gs_memory_t *mem));</tt></b>
</blockquote>

<p>
If it is necessary to make a structure descriptor public, it should be
declared in its clients as

<blockquote>
<b><tt>extern_st(st_xxx);</tt></b>
</blockquote>

<h3><a name="Objects"></a>"Objects"</h3>

<p>
Ghostscript makes heavy use of object-oriented constructs, including
analogues of classes, instances, subclassing, and class-associated
procedures.  However, these constructs are implemented in C rather than C++,
for two reasons:

<ul>

<li>The first Ghostscript code was written in 1986, long before C++ was
codified or was well supported by tools.  Even today, C++ tools rarely
support C++ as well as C tools support C.

<li>C++ imposes its own implementations for virtual procedures, inheritance,
run-time type information, and (to some extent) memory management.
Ghostscript requires use of its own memory manager, and also sometimes
requires the ability to change the virtual procedures of an object
dynamically.

</ul>

<h4>Classes</h4>

<p>
The source code representation of a class is simply a
<b><tt>typedef</tt></b> for a C <b><tt>struct</tt></b>.  See <a
href="C-style.htm#Structures">Structures</a>, above, for details.

<h4>Procedures</h4>

<p>
Ghostscript has no special construct for non-virtual procedures associated
with a class.  In some cases, the <b><tt>typedef</tt></b> for the class is
in a header file but the <b><tt>struct</tt></b> declaration is in the
implementation code file: this provides an extra level of opaqueness, since
clients then can't see the representation and must make all accesses through
procedures.  You should use this approach in new code, if it doesn't
increase the size of the code too much or require procedure calls for very
heavily used accesses.

<p>
Ghostscript uses three different approaches for storing and accessing
virtual procedures, plus a fourth one that is recommended but not currently
used.  For exposition, we assume the class (type) is named
<b><tt>xxx_t</tt></b>, it has a virtual procedure
<b><tt>void&nbsp;(*virtu)(P1(xxx_t&nbsp;*))</tt></b>, and we have a variable
declared as <b><tt>xxx_t&nbsp;*pxx</tt></b>.

<ol>

<li>The procedures are stored in a separate, constant structure of type
<b><tt>xxx_procs</tt></b>, of which <b><tt>virtu</tt></b> is a member.  The
structure definition of <b><tt>xxx_t</tt></b> includes a member defined as
<b><tt>const&nbsp;xxx_procs&nbsp;*procs</tt></b> (always named
<b><tt>procs</tt></b>).  The construct for calling the virtual procedure is
<b><tt>pxx->procs->virtu(pxx)</tt></b>.

<li>The procedures are defined in a structure of type
<b><tt>xxx_procs</tt></b> as above.  The structure definition of
<b><tt>xxx_t</tt></b> includes a member defined as
<b><tt>xxx_procs&nbsp;procs</tt></b> (always named <b><tt>procs</tt></b>).
The construct for calling the virtual procedure is
<b><tt>pxx->procs.virtu(pxx)</tt></b>.

<li>The procedures are not defined in a separate structure: each procedure
is a separate member of <b><tt>xxx_t</tt></b>.  The construct for calling
the virtual procedure is <b><tt>pxx->virtu(pxx)</tt></b>.

<li>The procedures are defined in a structure of type
<b><tt>xxx_procs</tt></b> as above.  The structure definition of
<b><tt>xxx_t</tt></b> includes a member defined as
<b><tt>xxx_procs&nbsp;procs[1]</tt></b> (always named
<b><tt>procs</tt></b>).  The construct for calling the virtual procedure is
again <b><tt>pxx->procs->virtu(pxx)</tt></b>.

</ol>

<p>
Note that in approach 1, the procedures are in a shared constant structure;
in approaches 2 - 4, they are in a per-instance structure that can be
changed dynamically, which is sometimes important.

<p>
In the present Ghostscript code, approach 1 is most common, followed by 2
and 3; 4 is not used at all.  For new code, you should use 1 or 4: that way,
all virtual procedure calls have the same form, regardless of whether the
procedures are shared and constant or per-instance and mutable.

<h4>Subclassing</h4>

<p>
Ghostscript's class mechanism allows for subclasses that can add data
members, or can add procedure members if approach 1 or 3 (above) is used.
Since C doesn't support subclassing, we use a convention to accomplish it.
In the example below, <b><tt>gx_device</tt></b> is the root class; it has a
subclass <b><tt>gx_device_forward</tt></b>, which in turn has a subclass
<b><tt>gx_device_null</tt></b>.  First we define a macro for all the members
of the root class, and the root class type.  (As for structures in general,
classes need a structure descriptor, as discussed in <a
href="#Structures">Structures</a> above: we include these in the examples
below.)

<blockquote><b><tt>
#define gx_device_common\<br>
&nbsp;&nbsp;&nbsp;&nbsp;type1 member1;\<br>
&nbsp;&nbsp;&nbsp;&nbsp;</tt></b>...<b><tt><br>
&nbsp;&nbsp;&nbsp;&nbsp;typeN memberN<br>
<br>
typedef struct gx_device_s {<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device_common;<br>
} gx_device;<br>
<br>
#define private_st_gx_device()&nbsp;&nbsp;/* in gsdevice.c */\<br>
&nbsp;&nbsp;gs_private_st_</tt></b>&lt;whatever&gt;<b><tt>(st_gx_device, gx_device,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;"gx_device", device_enum_ptrs, device_reloc_ptrs,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;</tt></b>... additional parameters as needed ...<b><tt>)</tt></b>
</tt></b></blockquote>

<p>
We then define a similar macro and type for the subclass.

<blockquote><b><tt>
#define gx_device_forward_common\<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device_common;\<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device *target<br>
<br>
typedef struct gx_device_forward_s {<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device_forward_common;<br>
} gx_device_forward;<br>
<br>
#define private_st_device_forward()&nbsp;&nbsp;/* in gsdevice.c */\<br>
&nbsp;&nbsp;gs_private_st_suffix_add1(st_device_forward, gx_device_forward,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;"gx_device_forward", device_forward_enum_ptrs, device_forward_reloc_ptrs,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device, target)
</tt></b></blockquote>

<p>
Finally, we define a leaf class, which doesn't need a macro because we don't
currently subclass it.  (We can create the macro later if needed, with no
changes anywhere else.)  In this particular case, the leaf class has no
additional data members, but it could have some.

<blockquote><b><tt>
typedef struct gx_device_null_s {<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device_forward_common;<br>
};<br>
<br>
#define private_st_device_null()&nbsp;&nbsp;/* in gsdevice.c */\<br>
&nbsp;&nbsp;gs_private_st_suffix_add0_local(st_device_null, gx_device_null,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;"gx_device_null", device_null_enum_ptrs, device_null_reloc_ptrs,\<br>
&nbsp;&nbsp;&nbsp;&nbsp;gx_device_forward)
</tt></b></blockquote>

<p>
Note that the above example is <strong>not</strong> the actual definition of
the <b><tt>gx_device</tt></b> structure type: the actual type has some
additional complications because it has a finalization procedure.  See <a
href="../src/gxdevcli.h">src/gxdevcli.h</a> for the details.

<p>
If you add members to a root class (such as <b><tt>gx_device</tt></b> in
this example), or change existing members, do this in the
<b><tt>gx_device_common</tt></b> macro, not the <b><tt>gx_device</tt></b>
structure definition.  Similarly, to change the
<b><tt>gx_device_forward</tt></b> class, modify the
<b><tt>gx_device_forward_common</tt></b> macro, not the structure
definition.  Only change the structure definition if the class is a leaf
class (one with no <b><tt>_common</tt></b> macro and no possibility of
subclassing), like <b><tt>gx_device_null</tt></b>.

<h3><a name="Error_handling"></a>Error handling</h3>

<p>
Every caller should check for error returns and, in general, propagate them
to <b>its</b> callers.  By convention, nearly every procedure returns an
<b><tt>int</tt></b> to indicate the outcome of the call:

<blockquote><table cellpadding=0 cellspacing=0>
<tr valign=top>	<td align=right>&lt; 0
	<td>&nbsp;&nbsp;&nbsp;&nbsp;
	<td>Error return
<tr valign=top>	<td align=right>0
	<td>&nbsp;
	<td>Normal return
<tr valign=top>	<td align=right>&gt; 0
	<td>&nbsp;
	<td>Non-error return other than the normal case
</table></blockquote>

<p>
To make a procedure generate an error and return it, as opposed to
propagating an error generated by a lower procedure, you should use

<blockquote>
<b><tt>return_error(</tt></b><em>error_number</em><b><tt>);</tt></b>
</blockquote>

<p>
Sometimes it is more convenient to generate the error in one place and
return it in another.  In this case, you should use

<blockquote>
<b><tt>code = gs_note_error(</tt></b><em>error_number</em><b><tt>);</tt></b><br>
...<br>
<b><tt>return code;</tt></b>
</blockquote>

<p>
In executables built for debugging, the <b><tt>-E</tt></b> (or
<b><tt>-Z#</tt></b>) command line switch causes <b><tt>return_error</tt></b>
and <b><tt>gs_note_error</tt></b> to print the error number and the source
file and line: this is often helpful for identifying the original cause of
an error.

<p>
See the file <a href="../src/gserrors.h">src/gserrors.h</a> for the error
return codes used by the graphics library, most of which correspond directly
to PostScript error conditions.

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>

<p>
<small>Copyright &copy; 1996, 1997, 1998 Aladdin Enterprises.
Copyright &copy; 2001 artofcode LLC.
All rights reserved.</small>

<p>
<small>This file is part of AFPL Ghostscript.  See the <a
href="Public.htm">Aladdin Free Public License</a> (the "License") for full
details of the terms of using, copying, modifying, and redistributing AFPL
Ghostscript.</small>

<p>
<small>Ghostscript version 8.12, 8 December 2003

<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
    H   H                                                  ?~ | x x                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"   "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Ghostscript change history</title>
<!-- generated by split_changelog.py from the output of cvs2cl.pl -->
<!-- $Id: Changes.htm,v 1.50 2003/12/09 06:57:48 giles Exp $ -->
<link rel=stylesheet type="text/css" href="gs.css">
</head>
<body>

<p><strong><a name="2003-12-09_0637"></a>
2003-12-09 06:37 Ray Johnston</strong></p>
<blockquote>
<pre>
Correct a long standing problem that caused non-optimized builds with
MSVC on Windows. The default TDEBUG was 1, which circumvented a change
made to msvccmd.mak to enable /O2 for MSVC_VERSION != 5. Note that
with MSVC 6 Service Pack 3 is required to avoid an INTERNAL COMPILER
ERROR when compiling src/idict.c.
</pre>
<p>[src/msvc32.mak 1.51]</p>
</blockquote>

<p><strong><a name="2003-12-09_0404"></a>
2003-12-09 04:04 Ralph Giles</strong></p>
<blockquote>
<pre>
Correct some inconsistent line endings.
</pre>
<p>[src/stdio_.h 1.10, src/ttfsfnt.h 1.5]</p>
</blockquote>

<p><strong><a name="2003-12-09_0305"></a>
2003-12-09 03:05 Ralph Giles</strong></p>
<blockquote>
<pre>
Updated release notes and change history for the 8.12 release.
</pre>
<p>[doc/Changes.htm 1.49, doc/Details.htm 1.8, doc/Details8.htm 1.4, doc/History8.htm 1.8, doc/News.htm 1.138]</p>
</blockquote>

<p><strong><a name="2003-12-08_2317"></a>
2003-12-08 23:17 Ralph Giles</strong></p>
<blockquote>
<pre>
Update documentation with release version and date.
</pre>
<p>[doc/API.htm 1.41, doc/Bug-form.htm 1.39, doc/Bug-info.htm 1.38, doc/C-style.htm 1.45, doc/Commprod.htm 1.30, doc/Copying.htm 1.29, doc/DLL.htm 1.33, doc/Deprecated.htm 1.10, doc/Details8.htm 1.3, doc/Develop.htm 1.127, doc/Devices.htm 1.72, doc/Drivers.htm 1.43, doc/Fonts.htm 1.39, doc/Helpers.htm 1.33, doc/History1.htm 1.29, doc/History2.htm 1.29, doc/History3.htm 1.29, doc/History4.htm 1.29, doc/History5.htm 1.31, doc/History6.htm 1.46, doc/History7.htm 1.34, doc/History8.htm 1.7, doc/Htmstyle.htm 1.34, doc/Install.htm 1.44, doc/Issues.htm 1.39, doc/Language.htm 1.78, doc/Lib.htm 1.32, doc/Maintain.htm 1.40, doc/Make.htm 1.70, doc/New-user.htm 1.49, doc/Projects.htm 1.56, doc/Ps-style.htm 1.27, doc/Ps2epsi.htm 1.31, doc/Ps2pdf.htm 1.56, doc/Psfiles.htm 1.50, doc/Readme.htm 1.52, doc/Release.htm 1.82, doc/Source.htm 1.29, doc/Tester.htm 1.29, doc/Testing.htm 1.23, doc/Unix-lpr.htm 1.29, doc/Use.htm 1.95, doc/Xfonts.htm 1.29, doc/gs-vms.hlp 1.28, man/dvipdf.1 1.27, man/font2c.1 1.27, man/gs.1 1.28, man/gslp.1 1.27, man/gsnd.1 1.27, man/pdf2dsc.1 1.26, man/pdf2ps.1 1.28, man/pdfopt.1 1.26, man/pf2afm.1 1.27, man/pfbtopfa.1 1.28, man/printafm.1 1.27, man/ps2ascii.1 1.26, man/ps2epsi.1 1.25, man/ps2pdf.1 1.32, man/ps2pdfwr.1 1.31, man/ps2ps.1 1.34, man/wftopfa.1 1.27]</p>
</blockquote>

<p><strong><a name="2003-12-08_2304"></a>
2003-12-08 23:04 Ralph Giles</strong></p>
<blockquote>
<pre>
Update date, product name and open bug list for release.
</pre>
<p>[doc/News.htm 1.137, src/gscdef.c 1.39, src/version.mak 1.67]</p>
</blockquote>

<p><strong><a name="2003-12-07_1756"></a>
2003-12-07 17:56 Ralph Giles</strong></p>
<blockquote>
<pre>
Add the experimental spot analysis source files to the developer file roadmap.
</pre>
<p>[doc/Develop.htm 1.126]</p>
</blockquote>

<p><strong><a name="2003-12-07_1617"></a>
2003-12-07 16:17 Igor Melichev</strong> (<a href="Details.htm#2003-12-07_1617">details</a>)</p>
<blockquote>
<pre>
Generalize the trapezoid fillling algorithm for curves, step 4.

</pre>
<p>[src/gxfdrop.c 1.5]</p>
</blockquote>

<p><strong><a name="2003-12-06_0338"></a>
2003-12-06 03:38 Ralph Giles</strong></p>
<blockquote>
<pre>
Respect the new regression differences section header when writing out the
split changelogs. The previous change only added the header to the detection
section.
</pre>
<p>[toolbin/split_changelog.py 1.7]</p>
</blockquote>

<p><strong><a name="2003-12-06_0328"></a>
2003-12-06 03:28 Ralph Giles</strong></p>
<blockquote>
<pre>
Also split changelog entries on the new "EXPECTED DIFFERENCES:" header.
</pre>
<p>[toolbin/split_changelog.py 1.6]</p>
</blockquote>

<p><strong><a name="2003-12-06_0148"></a>
2003-12-06 01:48 Ralph Giles</strong> (<a href="Details.htm#2003-12-06_0148">details</a>)</p>
<blockquote>
<pre>
In the autoconf build, add the general cflags generated by the configure script to the definition
the the definition of CCAUX. This works around a problem building on cygwin.

</pre>
<p>[src/Makefile.in 1.28]</p>
</blockquote>

<p><strong><a name="2003-12-04_1657"></a>
2003-12-04 16:57 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1657">details</a>)</p>
<blockquote>
<pre>
Fix : (type 1 hinter) Invalid contours with <=2 segments caused an infinite loop.

</pre>
<p>[src/gxhintn.c 1.37]</p>
</blockquote>

<p><strong><a name="2003-12-04_1619"></a>
2003-12-04 16:19 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1619">details</a>)</p>
<blockquote>
<pre>
Generalize the trapezoid fillling algorithm for curves, step 3.

</pre>
<p>[src/gxfill.c 1.57, src/gxpflat.c 1.10, src/gzpath.h 1.12]</p>
</blockquote>

<p><strong><a name="2003-12-04_1453"></a>
2003-12-04 14:53 Ralph Giles</strong></p>
<blockquote>
<pre>
Minor spelling and grammar corrections.
</pre>
<p>[doc/Devices.htm 1.71]</p>
</blockquote>

<p><strong><a name="2003-12-04_1352"></a>
2003-12-04 13:52 Igor Melichev</strong></p>
<blockquote>
<pre>
Document the new feature "Unicode support for high level devices".
</pre>
<p>[doc/Devices.htm 1.70]</p>
</blockquote>

<p><strong><a name="2003-12-04_1235"></a>
2003-12-04 12:35 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1235">details</a>)</p>
<blockquote>
<pre>
Fix : Cygwin/gcc compiler claimed possibly uninitialized variables.

</pre>
<p>[src/gdevdevn.c 1.12, src/gdevp14.c 1.20, src/gdevpdfm.c 1.34, src/gdevpdtc.c 1.30, src/gdevpdtf.c 1.32, src/gdevpdtt.c 1.68, src/gdevplnx.c 1.7, src/gdevprn.c 1.14, src/gdevps.c 1.38, src/gpmisc.c 1.22, src/gsalloc.c 1.20, src/gscie.c 1.14, src/gsfont.c 1.27, src/gxclpath.c 1.19, src/gxclrast.c 1.27, src/gxfcopy.c 1.38, src/gxfill.c 1.56, src/gximono.c 1.11, src/gxstroke.c 1.10, src/iscan.c 1.16, src/ttfmain.c 1.19, src/ttinterp.c 1.11, src/zdscpars.c 1.16, src/zht2.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-12-04_1109"></a>
2003-12-04 11:09 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1109">details</a>)</p>
<blockquote>
<pre>
Generalize the trapezoid fillling algorithm for curves, step 2.

</pre>
<p>[src/gx.h 1.18, src/gxfdrop.c 1.4, src/gxfill.c 1.55, src/gxfill.h 1.4, src/gxpflat.c 1.9, src/gzpath.h 1.11]</p>
</blockquote>

<p><strong><a name="2003-12-04_1010"></a>
2003-12-04 10:10 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1010">details</a>)</p>
<blockquote>
<pre>
Fix : misprints in lib.mak .

</pre>
<p>[src/lib.mak 1.151]</p>
</blockquote>

<p><strong><a name="2003-12-04_1007"></a>
2003-12-04 10:07 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1007">details</a>)</p>
<blockquote>
<pre>
Fix : an access to uninitialized data in zbfont.c .

</pre>
<p>[src/zbfont.c 1.26]</p>
</blockquote>

<p><strong><a name="2003-12-04_1001"></a>
2003-12-04 10:01 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_1001">details</a>)</p>
<blockquote>
<pre>
Fix : an access to uninitialized data in gxcpath.c .

</pre>
<p>[src/gxcpath.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-12-04_0946"></a>
2003-12-04 09:46 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_0946">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Type 1 subglyphs don't need Encoding entries.

</pre>
<p>[src/gxfcopy.c 1.37]</p>
</blockquote>

<p><strong><a name="2003-12-04_0937"></a>
2003-12-04 09:37 Igor Melichev</strong> (<a href="Details.htm#2003-12-04_0937">details</a>)</p>
<blockquote>
<pre>
Fix (type 1 hinter) : sbw was wrongly accounted with FontBBox over 4095 units.

</pre>
<p>[src/gstype1.c 1.30, src/gstype2.c 1.33, src/gxhintn.c 1.36, src/gxhintn.h 1.16]</p>
</blockquote>

<p><strong><a name="2003-12-04_0351"></a>
2003-12-04 03:51 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Add new files; make all lists separated with comma and terminated with a period.
</pre>
<p>[doc/Develop.htm 1.125]</p>
</blockquote>

<p><strong><a name="2003-12-03_2231"></a>
2003-12-03 22:31 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Add double-inclusion protection to errors.h to pacify the regression
test and rename double-inclusion protection variable in ierrors.h
for the naming consistency.
</pre>
<p>[src/errors.h 1.9, src/ierrors.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-12-01_1819"></a>
2003-12-01 18:19 Ralph Giles</strong></p>
<blockquote>
<pre>
Cygwin defines unsigned size-specific types with a u_ prefix in sys/types.h in analogy with MSVC.
Use these instead of the generic int types when defining the stdint.h size-specific types. Patch
from Alex Cherpanov. Fixes bug 687162.
</pre>
<p>[src/stdpre.h 1.21]</p>
</blockquote>

<p><strong><a name="2003-12-01_1649"></a>
2003-12-01 16:49 Ralph Giles</strong></p>
<blockquote>
<pre>
Add stdint fixed-length integer typedefs for cygwin. Apparently this platform defines the signed
versions in sys/types.h so we need only define the unsigned versions. After a patch by Alex
Cherpanov, bug 687162.
</pre>
<p>[src/stdpre.h 1.20]</p>
</blockquote>

<p><strong><a name="2003-11-30_1903"></a>
2003-11-30 19:03 Ralph Giles</strong></p>
<blockquote>
<pre>
Typedef uint64_t from 'unsigned __int64' on win32. From Alex Cherpanov's patch for bug 687162.
</pre>
<p>[src/stdpre.h 1.19]</p>
</blockquote>

<p><strong><a name="2003-11-27_2232"></a>
2003-11-27 22:32 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Add support to pnm images with max_pixel_value < (1<<depth)-1
Fix bug 687139.
</pre>
<p>[toolbin/tests/fuzzy.c 1.13]</p>
</blockquote>

<p><strong><a name="2003-11-27_0226"></a>
2003-11-27 02:26 Ralph Giles</strong></p>
<blockquote>
<pre>
Remove the search for long long / int64_t from genarch entirely. Neither of these
types is portable C as genarch must be, and nothing in Ghostscript actually requires
as 64-bit type, so the feature is inessential. (We do use a 64 bit type for gx_color_index
but that's passed through a separate define.) Bug 687161.
</pre>
<p>[src/genarch.c 1.8, src/std.h 1.10]</p>
</blockquote>

<p><strong><a name="2003-11-25_1532"></a>
2003-11-25 15:32 Igor Melichev</strong> (<a href="Details.htm#2003-11-25_1532">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : A fixed overflow in setup_image_compression.

</pre>
<p>[src/gdevpsdi.c 1.26]</p>
</blockquote>

<p><strong><a name="2003-11-25_0834"></a>
2003-11-25 08:34 Igor Melichev</strong> (<a href="Details.htm#2003-11-25_0834">details</a>)</p>
<blockquote>
<pre>
Fix : A misspelled TRAPEZIOD.

</pre>
<p>[src/gx.h 1.17, src/gxfdrop.c 1.3, src/gxfdrop.h 1.4, src/gxfill.c 1.54, src/gxfill.h 1.3, src/gxpath.h 1.10, src/gxpcopy.c 1.11, src/gzspotan.c 1.4]</p>
</blockquote>

<p><strong><a name="2003-11-25_0021"></a>
2003-11-25 00:21 Igor Melichev</strong> (<a href="Details.htm#2003-11-25_0021">details</a>)</p>
<blockquote>
<pre>
Generailze the trapezoid fillling algorithm for curves, step 1.
The new code is disabled with CURVED_TRAPEZIOD_FILL 0 in gx.h .

</pre>
<p>[src/gx.h 1.16, src/gxfdrop.c 1.2, src/gxfdrop.h 1.3, src/gxfill.c 1.53, src/gxfill.h 1.2, src/gxpath.h 1.9, src/gxpcopy.c 1.10, src/gxpflat.c 1.8, src/gzpath.h 1.10, src/vdtrace.h 1.9]</p>
</blockquote>

<p><strong><a name="2003-11-24_1450"></a>
2003-11-24 14:50 Igor Melichev</strong> (<a href="Details.htm#2003-11-24_1450">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 12).

</pre>
<p>[src/gxfill.c 1.52]</p>
</blockquote>

<p><strong><a name="2003-11-23_1844"></a>
2003-11-23 18:44 Igor Melichev</strong> (<a href="Details.htm#2003-11-23_1844">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 11).

</pre>
<p>[src/gxfill.c 1.51]</p>
</blockquote>

<p><strong><a name="2003-11-23_1016"></a>
2003-11-23 10:16 Igor Melichev</strong> (<a href="Details.htm#2003-11-23_1016">details</a>)</p>
<blockquote>
<pre>
[Log message beg]
Fix : Adding gs/Resource/Decoding/Latin1, which is used by FAPI/UFST with Intellifont fonts.

</pre>
<p>[Resource/Decoding/Latin1 1.1, lib/gs_stres.ps 1.7]</p>
</blockquote>

<p><strong><a name="2003-11-22_1854"></a>
2003-11-22 18:54 Ray Johnston</strong> (<a href="Details.htm#2003-11-22_1854">details</a>)</p>
<blockquote>
<pre>
Previous change assumed that all platforms have 'long long' type, but MSVC
doesn't have this. Use int64_t as set by stdpre.h instead.

</pre>
<p>[src/genarch.c 1.7]</p>
</blockquote>

<p><strong><a name="2003-11-21_2001"></a>
2003-11-21 20:01 Ralph Giles</strong></p>
<blockquote>
<pre>
Update indented preprocessor lines in code imported from Freetype to
put the '#' in the initial column, in accordance with the (slightly
more portable) Ghostscript convention.
</pre>
<p>[src/ttinterp.c 1.10, src/ttobjs.h 1.5, src/tttables.h 1.2, src/tttype.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-11-21_1842"></a>
2003-11-21 18:42 Ralph Giles</strong> (<a href="Details.htm#2003-11-21_1842">details</a>)</p>
<blockquote>
<pre>
Add a fallback definition of the common fixed-sized stdint types based on
the type sizes in the generated arch.h header. This should improve the portability
of uses of these types within the Ghostscript source.

</pre>
<p>[src/genarch.c 1.6, src/std.h 1.9, src/stdpre.h 1.18]</p>
</blockquote>

<p><strong><a name="2003-11-21_0416"></a>
2003-11-21 04:16 Dan Coby</strong> (<a href="Details.htm#2003-11-21_0416">details</a>)</p>
<blockquote>
<pre>
Fix for 687020 and 687146.  The pdfwrite device is incorrectly converting
CalRGB color spaces into ICC color spaces.  Fix #1.

</pre>
<p>[src/gdevpdfc.c 1.42]</p>
</blockquote>

<p><strong><a name="2003-11-20_2301"></a>
2003-11-20 23:01 Igor Melichev</strong> (<a href="Details.htm#2003-11-20_2301">details</a>)</p>
<blockquote>
<pre>
Factoring out the iterator for flattened curve segments.

</pre>
<p>[src/gxpflat.c 1.7, src/gzpath.h 1.9, src/lib.mak 1.150, src/vdtrace.c 1.8, src/vdtrace.h 1.8]</p>
</blockquote>

<p><strong><a name="2003-11-20_2052"></a>
2003-11-20 20:52 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Restore v.1.2 rolled back by mistake.
Partial fix for bug 687029
</pre>
<p>[src/ttfsfnt.h 1.4]</p>
</blockquote>

<p><strong><a name="2003-11-20_1847"></a>
2003-11-20 18:47 Ralph Giles</strong></p>
<blockquote>
<pre>
Add prefix headers for the MacOS build to define DEBUG for the appropriate targets. Bug
686844.
</pre>
<p>[src/macgenmcpxml.sh 1.11, src/macos_carbon_d_pre.h 1.1, src/macos_classic_d_pre.h 1.1]</p>
</blockquote>

<p><strong><a name="2003-11-20_1843"></a>
2003-11-20 18:43 Ralph Giles</strong></p>
<blockquote>
<pre>
Replace non-standard #if DEBUG lines with #ifdef DEBUG. Discovered in fixing bug 686844.
</pre>
<p>[src/igc.h 1.7]</p>
</blockquote>

<p><strong><a name="2003-11-20_1616"></a>
2003-11-20 16:16 Ralph Giles</strong></p>
<blockquote>
<pre>
Replace non-standard #if DEBUG lines with #ifdef DEBUG. Discovered in fixing bug 686844.
</pre>
<p>[src/igc.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-11-20_0753"></a>
2003-11-20 07:53 Igor Melichev</strong> (<a href="Details.htm#2003-11-20_0753">details</a>)</p>
<blockquote>
<pre>
Implementing a True Type grid fitting, step 3.

</pre>
<p>[src/gzspotan.c 1.3]</p>
</blockquote>

<p><strong><a name="2003-11-19_2233"></a>
2003-11-19 22:33 Ralph Giles</strong></p>
<blockquote>
<pre>
Add some basic instructions for creating an IDE project file for the example API client
code. Bug 669654.
</pre>
<p>[doc/API.htm 1.40]</p>
</blockquote>

<p><strong><a name="2003-11-19_2204"></a>
2003-11-19 22:04 Ralph Giles</strong></p>
<blockquote>
<pre>
Link to the MacOS example client from the API documentation, along with the others.
</pre>
<p>[doc/API.htm 1.39]</p>
</blockquote>

<p><strong><a name="2003-11-19_2059"></a>
2003-11-19 20:59 Ralph Giles</strong> (<a href="Details.htm#2003-11-19_2059">details</a>)</p>
<blockquote>
<pre>
Replace the code that removes the additional CFLAGS added by the AC_PROG_CC autoconf
macro. Closes bug 687150.

</pre>
<p>[src/configure.ac 1.34]</p>
</blockquote>

<p><strong><a name="2003-11-19_1309"></a>
2003-11-19 13:09 Igor Melichev</strong> (<a href="Details.htm#2003-11-19_1309">details</a>)</p>
<blockquote>
<pre>
Fix : The last change to ttfsfnt.h doesn't compile on Linux and has been undone.

</pre>
<p>[src/ttfsfnt.h 1.3]</p>
</blockquote>

<p><strong><a name="2003-11-19_0251"></a>
2003-11-19 02:51 Dan Coby</strong> (<a href="Details.htm#2003-11-19_0251">details</a>)</p>
<blockquote>
<pre>
Fix for 687131  Incorrect rendering for type 1 images when Interpolate ==
true.

</pre>
<p>[src/gdevdbit.c 1.10]</p>
</blockquote>

<p><strong><a name="2003-11-19_0146"></a>
2003-11-19 01:46 Dan Coby</strong></p>
<blockquote>
<pre>
Enhancement for bug 687148.  Add 12 and 16 bits to the possible number
of bits per component for the bit devices.
</pre>
<p>[src/gdevbit.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-11-18_1635"></a>
2003-11-18 16:35 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Replace non-portable types with ISO/IEC 988:1999 exact-size types.
Partial fix for bug 687029
</pre>
<p>[src/ttfsfnt.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-11-18_1324"></a>
2003-11-18 13:24 Igor Melichev</strong> (<a href="Details.htm#2003-11-18_1324">details</a>)</p>
<blockquote>
<pre>
Implementing a True Type grid fitting, step 2.

</pre>
<p>[src/gxttfb.c 1.19, src/gzspotan.c 1.2, src/gzspotan.h 1.2, src/lib.mak 1.149]</p>
</blockquote>

<p><strong><a name="2003-11-18_0129"></a>
2003-11-18 01:29 Dan Coby</strong></p>
<blockquote>
<pre>
Correct the documentation for the possible values of color_info.depth to
include values greater than 32 bits.  The documentation problem was found
by the user while investigating 687131.
</pre>
<p>[doc/Drivers.htm 1.42]</p>
</blockquote>

<p><strong><a name="2003-11-17_2017"></a>
2003-11-17 20:17 Ray Johnston</strong></p>
<blockquote>
<pre>
Fix the logic that conditionally disables interpolation. The previous only
worked if the max_gray was set to the same as max_color, but the macro
dci_std_color_max_gray set max_gray to 0 if the number of components was
> 1. Detected with bug #687147 for customer #750.
</pre>
<p>[src/gxiscale.c 1.8]</p>
</blockquote>

<p><strong><a name="2003-11-17_1642"></a>
2003-11-17 16:42 Igor Melichev</strong> (<a href="Details.htm#2003-11-17_1642">details</a>)</p>
<blockquote>
<pre>
Implementing a True Type grid fitting, step 1.

</pre>
<p>[src/gsfont.c 1.26, src/gx.h 1.15, src/gxfcache.h 1.21, src/gxfdrop.h 1.2, src/gxfill.c 1.50, src/gxttfb.c 1.18, src/gzspotan.c 1.1, src/gzspotan.h 1.1, src/lib.mak 1.148]</p>
</blockquote>

<p><strong><a name="2003-11-17_1546"></a>
2003-11-17 15:46 Igor Melichev</strong> (<a href="Details.htm#2003-11-17_1546">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Numeric errors appeared writing an UCR.

</pre>
<p>[src/gdevpdfg.c 1.44]</p>
</blockquote>

<p><strong><a name="2003-11-14_1859"></a>
2003-11-14 18:59 Alex Cherepanov</strong></p>
<blockquote>
<pre>
JAWS PDF generator encodes empty stream as jaws_empty[]. The stream declares
that the data block length is zero but zlib routines regard a zero length data
block to be an error. Check for this case and return EOF without calling zlib.
Fix bug 686779 from the customer 131
</pre>
<p>[src/lib.mak 1.147, src/szlibd.c 1.6]</p>
</blockquote>

<p><strong><a name="2003-11-14_1821"></a>
2003-11-14 18:21 Ray Johnston</strong></p>
<blockquote>
<pre>
First attempt to add information requested by Igor to identify when the
basline was set for a particular 'DIFFER' case. Bug #687142.
</pre>
<p>[toolbin/tests/gscheck_pdfwrite.py 1.15, toolbin/tests/gscheck_raster.py 1.6]</p>
</blockquote>

<p><strong><a name="2003-11-13_2241"></a>
2003-11-13 22:41 Igor Melichev</strong> (<a href="Details.htm#2003-11-13_2241">details</a>)</p>
<blockquote>
<pre>
Fix : Add double inclusion protection to the True Type interpreter bridge modules.

</pre>
<p>[src/ttconf.h 1.2, src/ttmisc.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-11-13_2227"></a>
2003-11-13 22:27 Igor Melichev</strong> (<a href="Details.htm#2003-11-13_2227">details</a>)</p>
<blockquote>
<pre>
Fix : The first clip path list element sometimes got an empty path.

</pre>
<p>[src/gxcpath.c 1.10]</p>
</blockquote>

<p><strong><a name="2003-11-13_1920"></a>
2003-11-13 19:20 Ray Johnston</strong> (<a href="Details.htm#2003-11-13_1920">details</a>)</p>
<blockquote>
<pre>
Fix: Adobe Acrobat Reader ignores an empty path when setting the clip
path. Bug #687136.

</pre>
<p>[lib/pdf_ops.ps 1.33]</p>
</blockquote>

<p><strong><a name="2003-11-13_1519"></a>
2003-11-13 15:19 Igor Melichev</strong> (<a href="Details.htm#2003-11-13_1519">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Transfer function was not checked for identity.

</pre>
<p>[src/gdevpdfg.c 1.43]</p>
</blockquote>

<p><strong><a name="2003-11-12_1958"></a>
2003-11-12 19:58 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Default to empty string when there's no /ID in the trailer and issue
a warning because the key is required for encrypted files.
Fix bug 687135
</pre>
<p>[lib/pdf_sec.ps 1.12]</p>
</blockquote>

<p><strong><a name="2003-11-12_1429"></a>
2003-11-12 14:29 Igor Melichev</strong> (<a href="Details.htm#2003-11-12_1429">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Write high level clipping paths.

</pre>
<p>[src/gdevpdfd.c 1.35, src/gxcpath.c 1.9, src/gzcpath.h 1.5]</p>
</blockquote>

<p><strong><a name="2003-11-11_1216"></a>
2003-11-11 12:16 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Use [/XYZ null null null] as a default destination following the Distiller
example. The old destination was clearly wrong because it positioned the
bottom of the page on the top of the screen, effectively displaying the
next page.
Fix bug 687129
</pre>
<p>[src/gdevpdfm.c 1.33]</p>
</blockquote>

<p><strong><a name="2003-11-11_1123"></a>
2003-11-11 11:23 Igor Melichev</strong> (<a href="Details.htm#2003-11-11_1123">details</a>)</p>
<blockquote>
<pre>
Fix : ..includecolorspace caused an abnormal recursion.

</pre>
<p>[src/gdevdflt.c 1.15, src/gdevnfwd.c 1.14, src/gdevpdfc.c 1.41, src/gdevpdfg.h 1.27, src/gdevpdfv.c 1.32, src/gscolor2.c 1.17, src/gscolor2.h 1.9, src/gxdevcli.h 1.20, src/zcolor.c 1.17, lib/gs_ciddc.ps 1.13, lib/gs_devcs.ps 1.6, lib/gs_init.ps 1.101]</p>
</blockquote>

<p><strong><a name="2003-11-10_1947"></a>
2003-11-10 19:47 Dan Coby</strong></p>
<blockquote>
<pre>
Continuation on the fix for 687101, Crash in GC on some PDF files.
This change adds comments to GS procedures for the imager state
structure.  These comments Were added to prevent confusion about the
handling of the effective transfer pointers.
</pre>
<p>[src/gsistate.c 1.8]</p>
</blockquote>

<p><strong><a name="2003-11-10_1655"></a>
2003-11-10 16:55 Igor Melichev</strong> (<a href="Details.htm#2003-11-10_1655">details</a>)</p>
<blockquote>
<pre>
Fix (type 1 hinter) : Hints were not applied to the last segment of a Type 2 glyph.

</pre>
<p>[src/gxhintn.c 1.35]</p>
</blockquote>

<p><strong><a name="2003-11-10_1334"></a>
2003-11-10 13:34 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix : Refer new source modules from Develop.htm .
</pre>
<p>[doc/Develop.htm 1.124]</p>
</blockquote>

<p><strong><a name="2003-11-08_0744"></a>
2003-11-08 07:44 Dan Coby</strong></p>
<blockquote>
<pre>
Add and option for specifying banded/noband.  The current version actually
uses 1 to specify banding and 0 to specify no banding. This is the optional
fourth parameter.
</pre>
<p>[toolbin/tests/make_two_versions 1.12]</p>
</blockquote>

<p><strong><a name="2003-11-07_0440"></a>
2003-11-07 04:40 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Restore the invariant: effective_transfer always points to the transfer
functions in the graphic state or halftone. Old code briefly left
effective_transfer pointing to garbage, which caused relocation of garbage
pointers and crash if GC happened at the right time.
Fix bug 687101
</pre>
<p>[src/gscolor.c 1.12, src/gscolor1.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-11-04_0125"></a>
2003-11-04 01:25 Dan Coby</strong> (<a href="Details.htm#2003-11-04_0125">details</a>)</p>
<blockquote>
<pre>
Fix for 686796 tiffg4 device and incorrect halftone frequency.
This eliminates a problem with not choosing the best halftone cell size
when more than one possible cell size has the exact angle requested.

</pre>
<p>[src/gshtscr.c 1.14]</p>
</blockquote>

<p><strong><a name="2003-11-03_1036"></a>
2003-11-03 10:36 Ralph Giles</strong></p>
<blockquote>
<pre>
Correct spelling and wording.
</pre>
<p>[doc/Use.htm 1.94]</p>
</blockquote>

<p><strong><a name="2003-11-03_0239"></a>
2003-11-03 02:39 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Initialize cc->pair field for the external fonts, forgotten
during the switch to new TrueType interpreter (NEW_TT_INTERPRETER).
Fix bug 687116
</pre>
<p>[src/gxccache.c 1.28]</p>
</blockquote>

<p><strong><a name="2003-11-01_1318"></a>
2003-11-01 13:18 Igor Melichev</strong> (<a href="Details.htm#2003-11-01_1318">details</a>)</p>
<blockquote>
<pre>
Fix (font resource machinery) : Dont try reloading fonts if the platform has no native fonts.

</pre>
<p>[lib/gs_fonts.ps 1.44]</p>
</blockquote>

<p><strong><a name="2003-11-01_0443"></a>
2003-11-01 04:43 Alex Cherepanov</strong> (<a href="Details.htm#2003-11-01_0443">details</a>)</p>
<blockquote>
<pre>
Following the PDF spec ignore "/Encrypt null" entry in the trailer.
Fix bug 687117

</pre>
<p>[lib/pdf_main.ps 1.81]</p>
</blockquote>

<p><strong><a name="2003-10-31_2212"></a>
2003-10-31 22:12 Igor Melichev</strong> (<a href="Details.htm#2003-10-31_2212">details</a>)</p>
<blockquote>
<pre>
Fix (font resource machinery) : Provide correct font names for graphics library.

</pre>
<p>[src/zbfont.c 1.25, lib/gs_fonts.ps 1.43, doc/Use.htm 1.93]</p>
</blockquote>

<p><strong><a name="2003-10-30_1456"></a>
2003-10-30 14:56 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_1456">details</a>)</p>
<blockquote>
<pre>
Fix (dropout prevention) : The expression for choosing a pixel to paint with narrow trapesoids
was wrong (An improved revision).

</pre>
<p>[src/gxdtfill.h 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-30_1256"></a>
2003-10-30 12:56 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_1256">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 10).

</pre>
<p>[src/gxfill.c 1.49]</p>
</blockquote>

<p><strong><a name="2003-10-30_1139"></a>
2003-10-30 11:39 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_1139">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 8).

</pre>
<p>[src/gxfill.c 1.48]</p>
</blockquote>

<p><strong><a name="2003-10-30_1102"></a>
2003-10-30 11:02 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_1102">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 7).

</pre>
<p>[src/gxfill.c 1.47]</p>
</blockquote>

<p><strong><a name="2003-10-30_1045"></a>
2003-10-30 10:45 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_1045">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 6).

</pre>
<p>[src/gxfill.c 1.46]</p>
</blockquote>

<p><strong><a name="2003-10-30_0933"></a>
2003-10-30 09:33 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_0933">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 5).

</pre>
<p>[src/gxfdrop.c 1.1, src/gxfdrop.h 1.1, src/gxfill.c 1.45, src/gxfill.h 1.1, src/lib.mak 1.146]</p>
</blockquote>

<p><strong><a name="2003-10-30_0755"></a>
2003-10-30 07:55 Igor Melichev</strong> (<a href="Details.htm#2003-10-30_0755">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 4).

</pre>
<p>[src/gxfill.c 1.44]</p>
</blockquote>

<p><strong><a name="2003-10-30_0634"></a>
2003-10-30 06:34 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Correct a typo in source leading to failure of form selection for PCL
printers. (contributed by Jim Bandy)
Fix bug 686815
</pre>
<p>[src/gdevdljm.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-10-29_1743"></a>
2003-10-29 17:43 Igor Melichev</strong> (<a href="Details.htm#2003-10-29_1743">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 2).

</pre>
<p>[src/gxfill.c 1.43]</p>
</blockquote>

<p><strong><a name="2003-10-29_1558"></a>
2003-10-29 15:58 Igor Melichev</strong> (<a href="Details.htm#2003-10-29_1558">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 2).

</pre>
<p>[src/gxfill.c 1.42]</p>
</blockquote>

<p><strong><a name="2003-10-29_1457"></a>
2003-10-29 14:57 Igor Melichev</strong> (<a href="Details.htm#2003-10-29_1457">details</a>)</p>
<blockquote>
<pre>
Fix : Simplify the filling algorithm (step 1).

</pre>
<p>[src/gxfill.c 1.41]</p>
</blockquote>

<p><strong><a name="2003-10-28_1444"></a>
2003-10-28 14:44 Igor Melichev</strong> (<a href="Details.htm#2003-10-28_1444">details</a>)</p>
<blockquote>
<pre>
Fix (dropout prevention) : The expression for choosing a pixel to paint with narrow trapesoids
was wrong. The old code sometimes unreasonably shifted stems in 1 pixel.

</pre>
<p>[src/gxdtfill.h 1.5, src/gxfill.c 1.40]</p>
</blockquote>

<p><strong><a name="2003-10-28_1442"></a>
2003-10-28 14:42 Igor Melichev</strong> (<a href="Details.htm#2003-10-28_1442">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 21, final).

</pre>
<p>[src/gx.h 1.14, doc/Develop.htm 1.123, doc/Language.htm 1.77, doc/Projects.htm 1.55, doc/Use.htm 1.92]</p>
</blockquote>

<p><strong><a name="2003-10-27_1045"></a>
2003-10-27 10:45 Igor Melichev</strong> (<a href="Details.htm#2003-10-27_1045">details</a>)</p>
<blockquote>
<pre>
Reclaim global memory in the beginning of the interpreter finalization (continued).

</pre>
<p>[src/imain.c 1.37]</p>
</blockquote>

<p><strong><a name="2003-10-27_0904"></a>
2003-10-27 09:04 Igor Melichev</strong> (<a href="Details.htm#2003-10-27_0904">details</a>)</p>
<blockquote>
<pre>
Fix : Removing the PDF Widths project from Project.htm .

</pre>
<p>[doc/Projects.htm 1.54]</p>
</blockquote>

<p><strong><a name="2003-10-27_0802"></a>
2003-10-27 08:02 Igor Melichev</strong> (<a href="Details.htm#2003-10-27_0802">details</a>)</p>
<blockquote>
<pre>
Fix (garbager) : The back pointer validity constraint was wrong.

</pre>
<p>[src/igc.c 1.11, src/igc.h 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-26_0052"></a>
2003-10-26 00:52 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Apply oforce to every element of MediaBox and CropBox arrays.
Fix bug 687035 from customer 831
</pre>
<p>[lib/pdf_base.ps 1.39, lib/pdf_main.ps 1.80]</p>
</blockquote>

<p><strong><a name="2003-10-24_0614"></a>
2003-10-24 06:14 Dan Coby</strong></p>
<blockquote>
<pre>
Some minor clean up for the makefiles:
1.  Correct lines that should start with tabs.
2.  Clear some lines which only contain spaces.
</pre>
<p>[src/bcwin32.mak 1.30, src/dvx-gcc.mak 1.24, src/macos-mcp.mak 1.23, src/macosx.mak 1.21, src/msvc32.mak 1.50, src/msvclib.mak 1.25, src/msvctail.mak 1.10, src/openvms.mak 1.33, src/os2.mak 1.35, src/ugcclib.mak 1.26, src/unixansi.mak 1.33]</p>
</blockquote>

<p><strong><a name="2003-10-23_1745"></a>
2003-10-23 17:45 Igor Melichev</strong> (<a href="Details.htm#2003-10-23_1745">details</a>)</p>
<blockquote>
<pre>
Fix (PDF interpreter) : Shared CID font descriptors did not work properly.

</pre>
<p>[lib/pdf_font.ps 1.59]</p>
</blockquote>

<p><strong><a name="2003-10-23_1046"></a>
2003-10-23 10:46 Igor Melichev</strong> (<a href="Details.htm#2003-10-23_1046">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Restrict Tj offsets.

</pre>
<p>[src/gdevpdts.c 1.27]</p>
</blockquote>

<p><strong><a name="2003-10-23_0956"></a>
2003-10-23 09:56 Igor Melichev</strong> (<a href="Details.htm#2003-10-23_0956">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : MSVC compiler warning.

</pre>
<p>[src/gdevpdte.c 1.49]</p>
</blockquote>

<p><strong><a name="2003-10-23_0949"></a>
2003-10-23 09:49 Igor Melichev</strong> (<a href="Details.htm#2003-10-23_0949">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Optimize pdf_make_text_glyphs_table_unencoded.

</pre>
<p>[src/gdevpdtt.c 1.67, src/gdevpdtt.h 1.20, src/gscencs.c 1.7, src/gscencs.h 1.5]</p>
</blockquote>

<p><strong><a name="2003-10-23_0904"></a>
2003-10-23 09:04 Igor Melichev</strong> (<a href="Details.htm#2003-10-23_0904">details</a>)</p>
<blockquote>
<pre>
Fix : ColorSpace resource files define global resources.

</pre>
<p>[Resource/ColorSpace/DefaultCMYK 1.2, Resource/ColorSpace/DefaultGray 1.2, Resource/ColorSpace/DefaultRGB 1.2]</p>
</blockquote>

<p><strong><a name="2003-10-22_1955"></a>
2003-10-22 19:55 Ralph Giles</strong></p>
<blockquote>
<pre>
Always install all the available resource categories (directories) on
unix, in place of the earlier hard-wired list. Closes bug 687092.
</pre>
<p>[src/unixinst.mak 1.34]</p>
</blockquote>

<p><strong><a name="2003-10-22_1948"></a>
2003-10-22 19:48 Ralph Giles</strong></p>
<blockquote>
<pre>
Add the new ColorSpace directory to the list of installed resource
categories. This is the quick fix version of the resolution for Bug
687092.
</pre>
<p>[src/unixinst.mak 1.33]</p>
</blockquote>

<p><strong><a name="2003-10-22_1935"></a>
2003-10-22 19:35 Dan Coby</strong></p>
<blockquote>
<pre>
Fix for 687099 Rebulding XREF leaves 1 object on the stack.  The  bug
title is erroneous.  All PDF files were leaving one item, a zero, on
the stack.  The problem was caused by an incorrect definition of
pdfemptycount.
</pre>
<p>[lib/pdf_main.ps 1.79]</p>
</blockquote>

<p><strong><a name="2003-10-22_1645"></a>
2003-10-22 16:45 stefan</strong></p>
<blockquote>
<pre>
file gslibctx.c was initially added on branch gslibctx.
</pre>
<p>[src/gslibctx.c 1.1]</p>
</blockquote>

<p><strong><a name="2003-10-22_1645"></a>
2003-10-22 16:45 stefan</strong></p>
<blockquote>
<pre>
file gslibctx.h was initially added on branch gslibctx.
</pre>
<p>[src/gslibctx.h 1.1]</p>
</blockquote>

<p><strong><a name="2003-10-22_1639"></a>
2003-10-22 16:39 Dan Coby</strong></p>
<blockquote>
<pre>
Change the name of the switch NOSUBDEVICECOLORS to NOSUBSTDEVICECOLORS.
This was done to prevent confusion about being read as 'No subdevice
colors'.
</pre>
<p>[doc/Use.htm 1.91, lib/gs_devcs.ps 1.5, lib/gs_init.ps 1.100]</p>
</blockquote>

<p><strong><a name="2003-10-22_1311"></a>
2003-10-22 13:11 Igor Melichev</strong> (<a href="Details.htm#2003-10-22_1311">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Provide an extended encoding for glyphshow.

</pre>
<p>[src/devs.mak 1.100, src/gdevpdtc.c 1.29, src/gdevpdte.c 1.48, src/gdevpdtt.c 1.66, src/gdevpdtt.h 1.19]</p>
</blockquote>

<p><strong><a name="2003-10-22_1214"></a>
2003-10-22 12:14 Ralph Giles</strong> (<a href="Details.htm#2003-10-22_1214">details</a>)</p>
<blockquote>
<pre>
Update a call to map_rgb_color() to use the new encode_color() with a
component array argument. Partial resolution of Bug 686981.

</pre>
<p>[src/gdevcgm.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-10-22_1122"></a>
2003-10-22 11:22 Alex Cherepanov</strong> (<a href="Details.htm#2003-10-22_1122">details</a>)</p>
<blockquote>
<pre>
Restore standard functionality of bind operator in DELAYBIND mode after
.bindnow . Simplify the implementation logic and document the changes.
Fix bug 686746

</pre>
<p>[lib/gs_ll3.ps 1.20, doc/Language.htm 1.76, lib/gs_init.ps 1.99, lib/ps2ascii.ps 1.8]</p>
</blockquote>

<p><strong><a name="2003-10-22_0958"></a>
2003-10-22 09:58 Ralph Giles</strong></p>
<blockquote>
<pre>
Make a sentence fragment a clause.
</pre>
<p>[doc/Drivers.htm 1.41]</p>
</blockquote>

<p><strong><a name="2003-10-22_0855"></a>
2003-10-22 08:55 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Dereference indirect objects during conversion from PDF form XObject to
PostScript form. Minimize dictionary copying.
Fix bug 686953.
</pre>
<p>[lib/pdf_draw.ps 1.79]</p>
</blockquote>

<p><strong><a name="2003-10-22_0707"></a>
2003-10-22 07:07 Igor Melichev</strong> (<a href="Details.htm#2003-10-22_0707">details</a>)</p>
<blockquote>
<pre>
Fix (PDF interpreter) : Annotations, outlines and links pointing to
non-existing pages caused a failure with -dDOPDFMARKS.
Patch from Leon Bottou.

</pre>
<p>[lib/pdf_main.ps 1.78]</p>
</blockquote>

<p><strong><a name="2003-10-21_1502"></a>
2003-10-21 15:02 Igor Melichev</strong> (<a href="Details.htm#2003-10-21_1502">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Refactor pdf_obtain_font_resource.

</pre>
<p>[src/gdevpdtt.c 1.65]</p>
</blockquote>

<p><strong><a name="2003-10-21_1337"></a>
2003-10-21 13:37 Ralph Giles</strong></p>
<blockquote>
<pre>
Complete the replacement for fname_size described in the previous
commit. Part of fixing bug 686981.
</pre>
<p>[src/gdevcgm.c 1.8]</p>
</blockquote>

<p><strong><a name="2003-10-21_1328"></a>
2003-10-21 13:28 Ralph Giles</strong></p>
<blockquote>
<pre>
Replace a non-standard local filename length define with gp_file_name_sizeof.
</pre>
<p>[src/devs.mak 1.99, src/gdevcgm.c 1.7]</p>
</blockquote>

<p><strong><a name="2003-10-21_1154"></a>
2003-10-21 11:54 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Fix compiler warnings. Include gpmisc.h when needed.
Fix bug 687006.
</pre>
<p>[src/gp_dosfs.c 1.16, src/gp_macio.c 1.32, src/gp_ntfs.c 1.21, src/gp_unifn.c 1.15, src/gp_vms.c 1.36, src/int.mak 1.118, src/lib.mak 1.145, src/macos-mcp.mak 1.22, src/openvms.mak 1.32, src/openvms.mmk 1.27, src/stdio_.h 1.9, src/winplat.mak 1.5, src/zfile.c 1.39]</p>
</blockquote>

<p><strong><a name="2003-10-21_1120"></a>
2003-10-21 11:20 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Issue a path construction command after accumulation of 500 values to prevent
operand stack overflow.
Fix bug 687016
</pre>
<p>[src/gdevps.c 1.37]</p>
</blockquote>

<p><strong><a name="2003-10-21_1006"></a>
2003-10-21 10:06 Igor Melichev</strong> (<a href="Details.htm#2003-10-21_1006">details</a>)</p>
<blockquote>
<pre>
Fix : Disable the grid fitting while charproc accumulation (continued).

</pre>
<p>[src/gdevpdte.c 1.47, src/gdevpdti.c 1.22]</p>
</blockquote>

<p><strong><a name="2003-10-21_0805"></a>
2003-10-21 08:05 Igor Melichev</strong> (<a href="Details.htm#2003-10-21_0805">details</a>)</p>
<blockquote>
<pre>
Fix : Add newly defined resource files to static resources.

</pre>
<p>[lib/gs_stres.ps 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-21_0750"></a>
2003-10-21 07:50 Igor Melichev</strong> (<a href="Details.htm#2003-10-21_0750">details</a>)</p>
<blockquote>
<pre>
Fix : Some Cygwin/gcc compiler warnings.

</pre>
<p>[src/gdevpdfg.c 1.42, src/gdevpdtt.c 1.64, src/gxhintn.c 1.34, src/gxtype1.c 1.35, src/interp.c 1.17, src/isave.c 1.9, src/iscan.c 1.15, src/zfapi.c 1.49, src/zfont.c 1.9, src/devs.mak 1.98, src/icid.h 1.7, src/isave.h 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-21_0143"></a>
2003-10-21 01:43 Igor Melichev</strong> (<a href="Details.htm#2003-10-21_0143">details</a>)</p>
<blockquote>
<pre>
Fix : Disable the grid fitting while charproc accumulation.

</pre>
<p>[src/gdevpdte.c 1.46, src/gdevpdtt.c 1.63, src/gstext.c 1.14, src/gstype1.c 1.29, src/gstype1.h 1.9, src/gstype2.c 1.32, src/gxfcopy.c 1.36, src/gxhintn.c 1.33, src/gxhintn.h 1.15, src/gxtext.h 1.12, src/gxttfb.c 1.17, src/gxtype1.c 1.34, src/gxtype1.h 1.18, src/zchar1.c 1.34]</p>
</blockquote>

<p><strong><a name="2003-10-20_1206"></a>
2003-10-20 12:06 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Don't cache glyphs with a suspect bounding box. The patch tests for
(urx!=0 && llx==urx) || (ury!=0 && lly==ury) but suggestions of a
better test are allways welcome.
Fix bug 687015 from customer 440
</pre>
<p>[lib/pdf_font.ps 1.58]</p>
</blockquote>

<p><strong><a name="2003-10-19_1748"></a>
2003-10-19 17:48 Alex Cherepanov</strong> (<a href="Details.htm#2003-10-19_1748">details</a>)</p>
<blockquote>
<pre>
Return correct /DeviceGray color space from currentcolorspace operator
inside PaintProc of the uncolored pattern and cache device (bug 627169).
Use igs->color_space to track the current color space.
Fix bug 687080 from customer 710.

</pre>
<p>[src/int.mak 1.117, src/zcolor.c 1.16]</p>
</blockquote>

<p><strong><a name="2003-10-19_0615"></a>
2003-10-19 06:15 Ray Johnston</strong> (<a href="Details.htm#2003-10-19_0615">details</a>)</p>
<blockquote>
<pre>
Fix: Pattern color spaces that used save/restore within the PaintProc
would result in infinite looping with high level devices such as the
pdfwrite device since the restore cleared the pattern cache so that
after the restore, the pattern PaintProc would need to be executed
again. Bug #687052 for customer #411.

</pre>
<p>[src/gxpcmap.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-10-16_2042"></a>
2003-10-16 20:42 Igor Melichev</strong> (<a href="Details.htm#2003-10-16_2042">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Fonts used in a charproc were not added to Resources of some pages.

</pre>
<p>[src/gdevpdf.c 1.75, src/gdevpdfx.h 1.77, src/gdevpdte.c 1.45, src/gdevpdtf.h 1.21, src/gdevpdti.c 1.21, src/gdevpdts.c 1.26, src/gdevpdtt.c 1.62, src/gdevpdtx.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-10-16_1337"></a>
2003-10-16 13:37 Igor Melichev</strong> (<a href="Details.htm#2003-10-16_1337">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : The font copying routine was inprecise.

</pre>
<p>[src/gdevpsft.c 1.31, src/gstype42.c 1.40, src/gxfcopy.c 1.35]</p>
</blockquote>

<p><strong><a name="2003-10-16_1233"></a>
2003-10-16 12:33 Igor Melichev</strong> (<a href="Details.htm#2003-10-16_1233">details</a>)</p>
<blockquote>
<pre>
Reclaim global memory in the beginning of the interpreter finalization.

</pre>
<p>[src/imain.c 1.36]</p>
</blockquote>

<p><strong><a name="2003-10-16_1123"></a>
2003-10-16 11:23 jeong</strong></p>
<blockquote>
<pre>
When Glyph names data is not available for a TrueType Format 2.0 font,
rangecheck error occured. It was due to an attempt to get the data
even when it is not available. Now when no name data is available,
/postnames is defined
as an empty array and the glyph won't get a name attached. Fixes
Bug#686961.
</pre>
<p>[lib/gs_ttf.ps 1.34]</p>
</blockquote>

<p><strong><a name="2003-10-16_1115"></a>
2003-10-16 11:15 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Fix error recovery code for PDF image; pop the operand of image operator
restored by the standard PS error recovery.
Fix bug 687081 from customer 770.
</pre>
<p>[lib/pdf_draw.ps 1.78]</p>
</blockquote>

<p><strong><a name="2003-10-15_1536"></a>
2003-10-15 15:36 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_1536">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Resources were prematurely freed, causing pending pointers.

</pre>
<p>[src/gdevpdf.c 1.74]</p>
</blockquote>

<p><strong><a name="2003-10-15_1535"></a>
2003-10-15 15:35 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_1535">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Don't recompute FontBBox for CID font subsets.

</pre>
<p>[src/gdevpdtd.c 1.15]</p>
</blockquote>

<p><strong><a name="2003-10-15_1134"></a>
2003-10-15 11:34 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_1134">details</a>)</p>
<blockquote>
<pre>
Fix : A minor code cleanup in zfont42.c .

</pre>
<p>[src/zfont42.c 1.17]</p>
</blockquote>

<p><strong><a name="2003-10-15_1129"></a>
2003-10-15 11:29 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_1129">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : A bug in memory descriptor.

</pre>
<p>[src/gsstruct.h 1.17, src/gxfcopy.c 1.34]</p>
</blockquote>

<p><strong><a name="2003-10-15_0853"></a>
2003-10-15 08:53 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_0853">details</a>)</p>
<blockquote>
<pre>
Reclaim global memory in the beginning of the interpreter finalization.

</pre>
<p>[src/imain.c 1.35, src/interp.c 1.16, src/interp.h 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-15_0750"></a>
2003-10-15 07:50 Dan Coby</strong> (<a href="Details.htm#2003-10-15_0750">details</a>)</p>
<blockquote>
<pre>
Change the name of NOSUBCOLORSPACES to NOSUBDEVICECOLORS.

</pre>
<p>[doc/Use.htm 1.90, lib/gs_devcs.ps 1.4, lib/gs_init.ps 1.98]</p>
</blockquote>

<p><strong><a name="2003-10-15_0734"></a>
2003-10-15 07:34 Dan Coby</strong></p>
<blockquote>
<pre>
Add new header file src/gdevdevn.h to doc/Develop.htm.
</pre>
<p>[doc/Develop.htm 1.122]</p>
</blockquote>

<p><strong><a name="2003-10-15_0003"></a>
2003-10-15 00:03 Igor Melichev</strong> (<a href="Details.htm#2003-10-15_0003">details</a>)</p>
<blockquote>
<pre>
Fix (True Type font loader) : 'glyf' and 'loca' were loaded emulating a CID font with True Type,
causing an unuseful huge memory consumtion.

</pre>
<p>[lib/gs_ttf.ps 1.33]</p>
</blockquote>

<p><strong><a name="2003-10-14_2037"></a>
2003-10-14 20:37 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_2037">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Resources were prematurely freed, causing duplicated objects in the output.

</pre>
<p>[src/gdevpdfc.c 1.40, src/gdevpdfu.c 1.43]</p>
</blockquote>

<p><strong><a name="2003-10-14_1500"></a>
2003-10-14 15:00 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_1500">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Applying .includecolorspace to insert "default" color spaces.

</pre>
<p>[lib/gs_devcs.ps 1.3, lib/gs_ll3.ps 1.19]</p>
</blockquote>

<p><strong><a name="2003-10-14_1458"></a>
2003-10-14 14:58 Igor Melichev</strong></p>
<blockquote>
<pre>
Initial commit for ColorSpace resources.
</pre>
<p>[Resource/ColorSpace/DefaultCMYK 1.1, Resource/ColorSpace/DefaultGray 1.1, Resource/ColorSpace/DefaultRGB 1.1]</p>
</blockquote>

<p><strong><a name="2003-10-14_1253"></a>
2003-10-14 12:53 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_1253">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 20).

</pre>
<p>[src/gxccache.c 1.27, src/gxttfb.c 1.16, src/ttfmain.c 1.18]</p>
</blockquote>

<p><strong><a name="2003-10-14_1243"></a>
2003-10-14 12:43 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_1243">details</a>)</p>
<blockquote>
<pre>
Define a new special operator .includecolorspace and new device virtual function
include_color_space. Implement the latter for pdfwrite.

</pre>
<p>[src/gdevbbox.c 1.15, src/gdevdflt.c 1.14, src/gdevnfwd.c 1.13, src/gdevpdf.c 1.73, src/gdevpdfd.c 1.34, src/gdevpdfv.c 1.31, src/gdevpdfx.h 1.76, src/gdevrops.c 1.9, src/gscolor2.c 1.16, src/gscolor2.h 1.8, src/gxclip.c 1.12, src/gxclip2.c 1.9, src/gxclipm.c 1.11, src/gxclist.c 1.12, src/gxdevcli.h 1.19, src/gxdevice.h 1.14, src/zcolor.c 1.15]</p>
</blockquote>

<p><strong><a name="2003-10-14_1015"></a>
2003-10-14 10:15 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_1015">details</a>)</p>
<blockquote>
<pre>
Fix (PDF interpreter) : Adjust the currentpoint saved back into TextMatrix so that it
does not include the effect of TextRise.

</pre>
<p>[lib/pdf_ops.ps 1.32]</p>
</blockquote>

<p><strong><a name="2003-10-14_0916"></a>
2003-10-14 09:16 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_0916">details</a>)</p>
<blockquote>
<pre>
Fix (resource machinery) : A bug in resourceforall.

</pre>
<p>[lib/gs_res.ps 1.36]</p>
</blockquote>

<p><strong><a name="2003-10-14_0914"></a>
2003-10-14 09:14 Igor Melichev</strong> (<a href="Details.htm#2003-10-14_0914">details</a>)</p>
<blockquote>
<pre>
Fix (Type 1 interpreter) : Provide a tolerance to a missed subglyph.

</pre>
<p>[src/gxfcopy.c 1.33, src/gxfont1.h 1.12, src/gxtype1.c 1.33, src/zchar1.c 1.33, src/zfcid0.c 1.21]</p>
</blockquote>

<p><strong><a name="2003-10-13_1910"></a>
2003-10-13 19:10 Igor Melichev</strong> (<a href="Details.htm#2003-10-13_1910">details</a>)</p>
<blockquote>
<pre>
Fix (FAPI/FreeType) : Upgrading to Free Type 2.1.5 .

</pre>
<p>[src/fapi_ft.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-10-13_1506"></a>
2003-10-13 15:06 Igor Melichev</strong> (<a href="Details.htm#2003-10-13_1506">details</a>)</p>
<blockquote>
<pre>
Fix (color space serialization) : Removing a constraint to the Sd function dimension.

</pre>
<p>[src/gsfunc0.c 1.13]</p>
</blockquote>

<p><strong><a name="2003-10-13_1216"></a>
2003-10-13 12:16 Igor Melichev</strong> (<a href="Details.htm#2003-10-13_1216">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 19).

</pre>
<p>[src/gxccache.c 1.26, src/gxttfb.c 1.15, src/ttfmain.c 1.17, src/ttfoutl.h 1.12, src/ttinterp.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-10-12_1909"></a>
2003-10-12 19:09 Igor Melichev</strong> (<a href="Details.htm#2003-10-12_1909">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 18).

</pre>
<p>[src/gxttfb.c 1.14, src/ttfmain.c 1.16, src/ttfmemd.c 1.6, src/ttfoutl.h 1.11]</p>
</blockquote>

<p><strong><a name="2003-10-10_0708"></a>
2003-10-10 07:08 Igor Melichev</strong> (<a href="Details.htm#2003-10-10_0708">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 17).

</pre>
<p>[src/gxccache.c 1.25, src/gxccman.c 1.22, src/gxfcache.h 1.20]</p>
</blockquote>

<p><strong><a name="2003-10-09_2226"></a>
2003-10-09 22:26 Dan Coby</strong></p>
<blockquote>
<pre>
Fix for 687055 pdfwrite should not fail with <</ProcessColorModel /DeviceN>>
setpagedevice.  This change adds support for the DeviceN process color
model to the pdfwrite device.  The DeviceN process color model is treated
like the DeviceCMYK process color model except for the name.
</pre>
<p>[src/gdevpdf.c 1.72, src/gdevpdfp.c 1.33]</p>
</blockquote>

<p><strong><a name="2003-10-09_2029"></a>
2003-10-09 20:29 Igor Melichev</strong> (<a href="Details.htm#2003-10-09_2029">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 16).

</pre>
<p>[src/gsfont.c 1.25, src/gxccman.c 1.21]</p>
</blockquote>

<p><strong><a name="2003-10-09_1919"></a>
2003-10-09 19:19 Igor Melichev</strong></p>
<blockquote>
<pre>
fuzzy.c : Implementing a ne option -c to switch on/off the reporting of coordinates of differences.
</pre>
<p>[toolbin/tests/fuzzy.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-10-09_1456"></a>
2003-10-09 14:56 Igor Melichev</strong> (<a href="Details.htm#2003-10-09_1456">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 15).

</pre>
<p>[src/gstype42.c 1.39, src/gxccache.c 1.24, src/gxccman.c 1.20, src/gxchar.c 1.37, src/gxfcache.h 1.19, src/gxttfb.c 1.13, src/gxttfb.h 1.9, src/ttfmain.c 1.15, src/ttfoutl.h 1.10, src/ttinterp.c 1.8]</p>
</blockquote>

<p><strong><a name="2003-10-09_1251"></a>
2003-10-09 12:51 Igor Melichev</strong> (<a href="Details.htm#2003-10-09_1251">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 14).

</pre>
<p>[src/gxccman.c 1.19, src/gxttfb.c 1.12, src/ttfmain.c 1.14]</p>
</blockquote>

<p><strong><a name="2003-10-09_0013"></a>
2003-10-09 00:13 Igor Melichev</strong> (<a href="Details.htm#2003-10-09_0013">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 13).

</pre>
<p>[lib/gs_init.ps 1.97, src/gsfont.c 1.24, src/gsfont.h 1.9, src/gxccman.c 1.18, src/gxfcache.h 1.18, src/gxttfb.c 1.11, src/gxttfb.h 1.8, src/icontext.c 1.17, src/ttfmain.c 1.13, src/ttfoutl.h 1.9, src/ttinterp.c 1.7, src/zusparam.c 1.10]</p>
</blockquote>

<p><strong><a name="2003-10-08_2207"></a>
2003-10-08 22:07 Igor Melichev</strong></p>
<blockquote>
<pre>
fuzzy.c : Implement a reporting of coordinates of different pixels.
</pre>
<p>[toolbin/tests/fuzzy.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-10-08_1853"></a>
2003-10-08 18:53 Igor Melichev</strong> (<a href="Details.htm#2003-10-08_1853">details</a>)</p>
<blockquote>
<pre>
Fix : Propagating return code from gs_main_finit to GSDLL API (continued).

</pre>
<p>[src/dmmain.c 1.3, src/dpmain.c 1.11, src/dwmain.c 1.15, src/dwmainc.c 1.17, src/dxmain.c 1.12, src/dxmainc.c 1.9, src/gsdll.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-10-08_1718"></a>
2003-10-08 17:18 Igor Melichev</strong></p>
<blockquote>
<pre>
Propagating return code from gs_main_finit to GSDLL API.
THIS IS INCOMPATIBLE CHANGE : the API had changed a prototype.

A close_device method can terminate with an error,
which was not delivered to clients.
It is especially important with pdfwrite,
which performs a big work in close_device.

Now clients can know about the error checking the return code
of the gsapi_exit function. See examples in doc/API.htm .
</pre>
<p>[doc/API.htm 1.38, src/dpmain.c 1.10, src/dwmain.c 1.14, src/dwmainc.c 1.16, src/gsexit.h 1.9, src/iapi.c 1.10, src/imain.c 1.34, src/imain.h 1.8]</p>
</blockquote>

<p><strong><a name="2003-10-08_1419"></a>
2003-10-08 14:19 Igor Melichev</strong> (<a href="Details.htm#2003-10-08_1419">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 12).

</pre>
<p>[src/ttfmain.c 1.12, src/ttinterp.c 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-08_1354"></a>
2003-10-08 13:54 Igor Melichev</strong> (<a href="Details.htm#2003-10-08_1354">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 11).

</pre>
<p>[src/gxccman.c 1.17, src/gxttfb.c 1.10, src/ttfmain.c 1.11, src/ttobjs.c 1.6, src/ttobjs.h 1.4]</p>
</blockquote>

<p><strong><a name="2003-10-08_1143"></a>
2003-10-08 11:43 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Contrary to the published spec (up to v.1.5) Acrobat Distiller 3.01 for Mac
can use /Identity instead of a tint transform function in /Separation color
space. Extend our PDF interpreter to cover this case.
Fix bug 687068.
</pre>
<p>[lib/pdf_draw.ps 1.77]</p>
</blockquote>

<p><strong><a name="2003-10-08_1134"></a>
2003-10-08 11:34 Igor Melichev</strong> (<a href="Details.htm#2003-10-08_1134">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 10).

</pre>
<p>[src/gstype42.c 1.38, src/gxccman.c 1.16, src/gxttfb.c 1.9, src/gxttfb.h 1.7, src/lib.mak 1.144, src/ttfmain.c 1.10, src/ttfoutl.h 1.8]</p>
</blockquote>

<p><strong><a name="2003-10-07_2002"></a>
2003-10-07 20:02 Igor Melichev</strong> (<a href="Details.htm#2003-10-07_2002">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 9).

</pre>
<p>[src/gxttfb.c 1.8, src/ttfmain.c 1.9, src/ttfmemd.c 1.5, src/ttfoutl.h 1.7, src/ttinterp.c 1.5, src/ttload.c 1.4, src/ttobjs.c 1.5]</p>
</blockquote>

<p><strong><a name="2003-10-07_1526"></a>
2003-10-07 15:26 Igor Melichev</strong> (<a href="Details.htm#2003-10-07_1526">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 8).

</pre>
<p>[src/gsfont.c 1.23, src/gstype42.c 1.37, src/gxccman.c 1.15, src/gxttfb.c 1.7, src/ttfmain.c 1.8, src/gxfcache.h 1.17, src/gxttfb.h 1.6, src/lib.mak 1.143, src/ttfmemd.c 1.4, src/ttfmemd.h 1.3, src/ttfoutl.h 1.6, src/ttinterp.c 1.4, src/ttobjs.c 1.4, src/ttobjs.h 1.3]</p>
</blockquote>

<p><strong><a name="2003-10-07_0003"></a>
2003-10-07 00:03 Dan Coby</strong> (<a href="Details.htm#2003-10-07_0003">details</a>)</p>
<blockquote>
<pre>
This is part of the fix for 687055.  This change splits the DeviceN
parameter handling.  The SeparationOrder parameter handling is split
into a separate routine.

</pre>
<p>[src/gdevdevn.c 1.11, src/gdevdevn.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-10-06_1908"></a>
2003-10-06 19:08 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_1908">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 7).

</pre>
<p>[src/gdevpdtd.c 1.14, src/ttfmain.c 1.7, src/ttobjs.c 1.3]</p>
</blockquote>

<p><strong><a name="2003-10-06_1643"></a>
2003-10-06 16:43 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_1643">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 6).

</pre>
<p>[src/gxttfb.c 1.6, src/ttfmain.c 1.6]</p>
</blockquote>

<p><strong><a name="2003-10-06_1642"></a>
2003-10-06 16:42 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_1642">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : A bug convertinging a CID to a glyph index.

</pre>
<p>[src/gstype42.c 1.36]</p>
</blockquote>

<p><strong><a name="2003-10-06_1220"></a>
2003-10-06 12:20 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_1220">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 5).

</pre>
<p>[src/gxccman.c 1.14, src/gxttfb.c 1.5, src/gxttfb.h 1.5, src/ttfmain.c 1.5, src/ttinterp.c 1.3, src/ttload.c 1.3]</p>
</blockquote>

<p><strong><a name="2003-10-06_1138"></a>
2003-10-06 11:38 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_1138">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 4).

</pre>
<p>[src/gsfont.c 1.22, src/gxccman.c 1.13, src/gxfcache.h 1.16, src/gxttfb.c 1.4, src/gxttfb.h 1.4, src/ttfmain.c 1.4, src/ttfmemd.c 1.3, src/ttfoutl.h 1.5, src/ttinterp.c 1.2, src/ttload.c 1.2, src/ttobjs.c 1.2, src/ttobjs.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-10-06_0834"></a>
2003-10-06 08:34 Igor Melichev</strong> (<a href="Details.htm#2003-10-06_0834">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 3).

</pre>
<p>[src/gstype42.c 1.35, src/gxccache.c 1.23, src/gxccman.c 1.12, src/gxchar.c 1.36, src/gxfcache.h 1.15, src/gxfont42.h 1.17, src/gxttfb.c 1.3, src/gxttfb.h 1.3, src/ttfmain.c 1.3, src/ttfoutl.h 1.4]</p>
</blockquote>

<p><strong><a name="2003-10-02_1530"></a>
2003-10-02 15:30 Igor Melichev</strong> (<a href="Details.htm#2003-10-02_1530">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter (step 2).

</pre>
<p>[src/gstype42.c 1.34, src/gxttfb.c 1.2, src/gxttfb.h 1.2, src/lib.mak 1.142, src/ttfmain.c 1.2, src/ttfoutl.h 1.3]</p>
</blockquote>

<p><strong><a name="2003-10-02_1148"></a>
2003-10-02 11:48 Igor Melichev</strong> (<a href="Details.htm#2003-10-02_1148">details</a>)</p>
<blockquote>
<pre>
Implementing a bridge to the True Type bytecode interpreter.

</pre>
<p>[src/gstext.c 1.13, src/gstype42.c 1.33, src/gx.h 1.13, src/gxccache.c 1.22, src/gxccman.c 1.11, src/gxchar.c 1.35, src/gxfcache.h 1.14, src/gxfont42.h 1.16, src/gxttfb.c 1.1, src/ttfmemd.c 1.2, src/zchar42.c 1.13, src/gxtext.h 1.11, src/gxttfb.h 1.1, src/lib.mak 1.141, src/ttfmemd.h 1.2, src/ttfoutl.h 1.2]</p>
</blockquote>

<p><strong><a name="2003-10-02_1015"></a>
2003-10-02 10:15 Igor Melichev</strong> (<a href="Details.htm#2003-10-02_1015">details</a>)</p>
<blockquote>
<pre>
Fix : Removing the dependence on graphic state from font cache rutines.

</pre>
<p>[src/gxccache.c 1.21, src/gxccman.c 1.10, src/gxchar.c 1.34, src/gxfcache.h 1.13]</p>
</blockquote>

<p><strong><a name="2003-10-02_0959"></a>
2003-10-02 09:59 Igor Melichev</strong> (<a href="Details.htm#2003-10-02_0959">details</a>)</p>
<blockquote>
<pre>
Fix : Characters were cached mixing alpha bits numbers (continued).

</pre>
<p>[src/gxccache.c 1.20, src/gxccman.c 1.9, src/gxfcache.h 1.12]</p>
</blockquote>

<p><strong><a name="2003-10-02_0851"></a>
2003-10-02 08:51 Igor Melichev</strong> (<a href="Details.htm#2003-10-02_0851">details</a>)</p>
<blockquote>
<pre>
Fix : Characters were cached mixing alpha bits numbers.

</pre>
<p>[src/gxccache.c 1.19, src/gxchar.c 1.33, src/gxfcache.h 1.11]</p>
</blockquote>

<p><strong><a name="2003-10-02_0702"></a>
2003-10-02 07:02 Dan Coby</strong></p>
<blockquote>
<pre>
Move the various device fields associated with the DeviceN process
color model into a common structure.  This allows common routines to
be used to support DeviceN process color model features on different
devices.  The src/gdevdevn.h file was added to define common fields
and structures.

The first application of this code is for 687055 - Adding support for
the DeviceN process color model to the pdfwrite device.
</pre>
<p>[src/devs.mak 1.97, src/gdevdevn.c 1.10, src/gdevdevn.h 1.1]</p>
</blockquote>

<p><strong><a name="2003-10-01_1636"></a>
2003-10-01 16:36 Jack Moffitt</strong></p>
<blockquote>
<pre>
Fix two bugs in testdiff that work around missing baselines.
</pre>
<p>[toolbin/tests/testdiff 1.4]</p>
</blockquote>

<p><strong><a name="2003-10-01_1344"></a>
2003-10-01 13:44 Igor Melichev</strong> (<a href="Details.htm#2003-10-01_1344">details</a>)</p>
<blockquote>
<pre>
Initial commit for a reduced True Type bytecode interpreter.

</pre>
<p>[src/lib.mak 1.140, src/ttcalc.c 1.1, src/ttcalc.h 1.1, src/ttcommon.h 1.1, src/ttconf.h 1.1, src/ttconfig.h 1.1, src/ttfinp.c 1.1, src/ttfinp.h 1.1, src/ttfmain.c 1.1, src/ttfmemd.c 1.1, src/ttfmemd.h 1.1, src/ttfoutl.h 1.1, src/ttfsfnt.h 1.1, src/ttinterp.c 1.1, src/ttinterp.h 1.1, src/ttload.c 1.1, src/ttload.h 1.1, src/ttmisc.h 1.1, src/ttobjs.c 1.1, src/ttobjs.h 1.1, src/tttables.h 1.1, src/tttype.h 1.1, src/tttypes.h 1.1]</p>
</blockquote>

<p><strong><a name="2003-09-30_1516"></a>
2003-09-30 15:16 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Handle missing /BitsPerComponent key case.
Fix bug 687956.
</pre>
<p>[lib/pdf_draw.ps 1.76]</p>
</blockquote>

<p><strong><a name="2003-09-30_1100"></a>
2003-09-30 11:00 Igor Melichev</strong> (<a href="Details.htm#2003-09-30_1100">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Don't use Tj when real width is smaller than 1% of Widths.

</pre>
<p>[src/gdevpdts.c 1.25]</p>
</blockquote>

<p><strong><a name="2003-09-29_2032"></a>
2003-09-29 20:32 Alex Cherepanov</strong> (<a href="Details.htm#2003-09-29_2032">details</a>)</p>
<blockquote>
<pre>
Fix calculation of the area where path segments can mark the current band.
Old code skipped segments above the page boundary regardless of the line width.
Fixes bug 686788 from customer 710.

</pre>
<p>[src/gxclpath.c 1.18]</p>
</blockquote>

<p><strong><a name="2003-09-29_1341"></a>
2003-09-29 13:41 Igor Melichev</strong> (<a href="Details.htm#2003-09-29_1341">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Don't synchronize graphic state before exiting a charproc.

</pre>
<p>[src/gdevpdtt.c 1.61]</p>
</blockquote>

<p><strong><a name="2003-09-28_1954"></a>
2003-09-28 19:54 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Convert input values to the traditional Lab range when input
color space of ICC profile is Lab. Before conversion all colors
were rendered 100 times darker, i.e. almost black.
Fixes bug 600288 from customer 150.
</pre>
<p>[src/gsicc.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-09-25_2123"></a>
2003-09-25 21:23 Igor Melichev</strong> (<a href="Details.htm#2003-09-25_2123">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Inline images mangled charproc stream.

</pre>
<p>[src/gdevpdfo.c 1.21, src/gdevpdfu.c 1.42, src/gdevpdfx.h 1.75]</p>
</blockquote>

<p><strong><a name="2003-09-24_1341"></a>
2003-09-24 13:41 Ralph Giles</strong> (<a href="Details.htm#2003-09-24_1341">details</a>)</p>
<blockquote>
<pre>
Correct a typo in the 'make so' target link line. This also allows the
Solaris linker to ignore the option, allowing the link to complete on
that platform. Thanks to Bob T. for pointing out the issue. Partial fix
for bug 686865.

</pre>
<p>[src/unix-dll.mak 1.10]</p>
</blockquote>

<p><strong><a name="2003-09-18_1320"></a>
2003-09-18 13:20 Igor Melichev</strong> (<a href="Details.htm#2003-09-18_1320">details</a>)</p>
<blockquote>
<pre>
Fix : Fonts with zero FontBBox were not anti-aliased.

</pre>
<p>[src/gxchar.c 1.32]</p>
</blockquote>

<p><strong><a name="2003-09-16_1354"></a>
2003-09-16 13:54 Igor Melichev</strong> (<a href="Details.htm#2003-09-16_1354">details</a>)</p>
<blockquote>
<pre>
Fix : A bug in compare_glyphs.

</pre>
<p>[src/gxfcopy.c 1.32]</p>
</blockquote>

<p><strong><a name="2003-09-16_1211"></a>
2003-09-16 12:11 Igor Melichev</strong> (<a href="Details.htm#2003-09-16_1211">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Don't write a clipping path with setcharwidth.

</pre>
<p>[src/gdevpdfg.c 1.41, src/gdevpdtt.c 1.60, src/gsht.c 1.17, src/gsstate.c 1.22, src/gxistate.h 1.17, src/gxstate.h 1.8]</p>
</blockquote>

<p><strong><a name="2003-09-16_1002"></a>
2003-09-16 10:02 Igor Melichev</strong> (<a href="Details.htm#2003-09-16_1002">details</a>)</p>
<blockquote>
<pre>
Don't apply Type 1 hinting to charpath.
THIS IS AN INCOMPATIBLE CHANGE : charpath now creates a different outline than before.

</pre>
<p>[src/gxtype1.c 1.32]</p>
</blockquote>

<p><strong><a name="2003-09-16_0711"></a>
2003-09-16 07:11 Dan Coby</strong></p>
<blockquote>
<pre>
Remove extra carriage returns (^M) at the end of some lines.
</pre>
<p>[lib/pdf_draw.ps 1.75]</p>
</blockquote>

<p><strong><a name="2003-09-15_2005"></a>
2003-09-15 20:05 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Following PLRM, set identity initial matrix for non-forwarding nulldevice.
Fix bug 687041
</pre>
<p>[src/gdevnfwd.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-09-15_1711"></a>
2003-09-15 17:11 Igor Melichev</strong> (<a href="Details.htm#2003-09-15_1711">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Write color commands to charprocs which don't call setcachedevice[2].

</pre>
<p>[src/gdevpdti.c 1.20, src/gdevpdtt.c 1.59]</p>
</blockquote>

<p><strong><a name="2003-09-15_1004"></a>
2003-09-15 10:04 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix : A bug in the new code of gs_rectfill (gsdps1.c Revision 1.9).
</pre>
<p>[src/gsdps1.c 1.10]</p>
</blockquote>

<p><strong><a name="2003-09-13_0204"></a>
2003-09-13 02:04 Russell Lang</strong></p>
<blockquote>
<pre>
Fix: Prevent crash caused by dsc_copy_string not stopping at the end
of a string occasionally.
Fixes bug 687045 "Crash while parsing long %%DocumentProcessColor line".
Report (atend) in the trailer as being unknown.
Recognise %%DocumentProcessColors and %%DocumentCustomColors
in the trailer.
Allocate colour details using the correct allocator so they
will be freed correctly.
</pre>
<p>[src/dscparse.c 1.14]</p>
</blockquote>

<p><strong><a name="2003-09-12_0442"></a>
2003-09-12 04:42 Dan Coby</strong> (<a href="Details.htm#2003-09-12_0442">details</a>)</p>
<blockquote>
<pre>
Provide a means for disabling color space substitution.

</pre>
<p>[doc/Use.htm 1.89, lib/gs_devcs.ps 1.2, lib/gs_init.ps 1.96]</p>
</blockquote>

<p><strong><a name="2003-09-11_2112"></a>
2003-09-11 21:12 Igor Melichev</strong> (<a href="Details.htm#2003-09-11_2112">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Implement CDevProc handling for CIDFontType 2.

</pre>
<p>[src/gdevpdtc.c 1.28, src/gdevpdte.c 1.44, src/gdevpdtt.c 1.58, src/gdevpdtt.h 1.18, src/gstext.h 1.9, src/gxfont.h 1.21, src/int.mak 1.116, src/zchar.c 1.12, src/zchar1.c 1.32, src/zchar42.c 1.12, src/zchar42.h 1.1]</p>
</blockquote>

<p><strong><a name="2003-09-11_2043"></a>
2003-09-11 20:43 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix (pdfwrite) : A part of CID text was missed after a font change.
</pre>
<p>[src/gdevpdtc.c 1.27]</p>
</blockquote>

<p><strong><a name="2003-09-11_1634"></a>
2003-09-11 16:34 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Ignore system-defined FILENAME_MAX when it is too small.
HP-UX 11i 11.11 incorrectly defines FILENAME_MAX as 14.
Fix bug 687030 from customer 1060
</pre>
<p>[src/gp_unifs.c 1.15]</p>
</blockquote>

<p><strong><a name="2003-09-11_1114"></a>
2003-09-11 11:14 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix (pdfwrite) : Stream content of ICC color space was missed.
It seems a very old bug...
</pre>
<p>[src/gdevpdfo.c 1.20]</p>
</blockquote>

<p><strong><a name="2003-09-10_1201"></a>
2003-09-10 12:01 Igor Melichev</strong> (<a href="Details.htm#2003-09-10_1201">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Improving text colors.

</pre>
<p>[src/gdevpdfb.c 1.20, src/gdevpdtt.c 1.57]</p>
</blockquote>

<p><strong><a name="2003-09-10_0801"></a>
2003-09-10 08:01 Igor Melichev</strong> (<a href="Details.htm#2003-09-10_0801">details</a>)</p>
<blockquote>
<pre>
Fix (pdfwrite) : Image XObject was not added into pattern's Resources.

</pre>
<p>[src/gdevpdfj.c 1.26]</p>
</blockquote>

<p><strong><a name="2003-09-09_2035"></a>
2003-09-09 20:35 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_2035">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Apply the color space serialization for color space comparizon (continued).

</pre>
<p>[src/gdevpdfc.c 1.39, src/gdevpdfg.c 1.40, src/gdevpdfg.h 1.26, src/gdevpdfv.c 1.30, src/gspcolor.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-09-09_1930"></a>
2003-09-09 19:30 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_1930">details</a>)</p>
<blockquote>
<pre>
pdfwrite : A minor code cleanup.

</pre>
<p>[src/gdevpdfc.c 1.38]</p>
</blockquote>

<p><strong><a name="2003-09-09_1603"></a>
2003-09-09 16:03 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_1603">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Apply the color space serialization for color space comparizon.

</pre>
<p>[src/devs.mak 1.96, src/gdevpdfc.c 1.37, src/gdevpdfg.h 1.25]</p>
</blockquote>

<p><strong><a name="2003-09-09_1554"></a>
2003-09-09 15:54 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_1554">details</a>)</p>
<blockquote>
<pre>
Implementing a serialization for color spaces and functions (continued 2).

</pre>
<p>[src/gsfunc.c 1.9, src/gsfunc0.c 1.12]</p>
</blockquote>

<p><strong><a name="2003-09-09_1425"></a>
2003-09-09 14:25 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_1425">details</a>)</p>
<blockquote>
<pre>
Implementing a serialization for color spaces and functions (continued).

</pre>
<p>[src/gscie.h 1.13, src/gscscie.c 1.10, src/gsicc.c 1.11, src/gspcolor.c 1.11, src/lib.mak 1.139]</p>
</blockquote>

<p><strong><a name="2003-09-09_1244"></a>
2003-09-09 12:44 Igor Melichev</strong> (<a href="Details.htm#2003-09-09_1244">details</a>)</p>
<blockquote>
<pre>
Implementing a serialization for color spaces and functions.

</pre>
<p>[src/gscdevn.c 1.15, src/gscdevn.h 1.8, src/gscolor2.c 1.15, src/gscpixel.c 1.9, src/gscscie.c 1.9, src/gscsepr.c 1.22, src/gscspace.c 1.10, src/gsfunc.c 1.8, src/gsfunc.h 1.9, src/gsfunc0.c 1.11, src/gsfunc3.c 1.16, src/gsfunc4.c 1.14, src/gxcspace.h 1.10, src/gxfunc.h 1.8, src/lib.mak 1.138]</p>
</blockquote>

<p><strong><a name="2003-09-08_1330"></a>
2003-09-08 13:30 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix : Cygwin/gcc compiler warnings.
</pre>
<p>[src/gdevdgbr.c 1.11, src/gstrans.c 1.18]</p>
</blockquote>

<p><strong><a name="2003-09-08_1319"></a>
2003-09-08 13:19 Igor Melichev</strong> (<a href="Details.htm#2003-09-08_1319">details</a>)</p>
<blockquote>
<pre>
Fix : Impproving the coordinate precision in function fill_rectangle_hl_color.

</pre>
<p>[src/gdevdflt.c 1.13, src/gdevnfwd.c 1.11, src/gdevpdfd.c 1.33, src/gsdps1.c 1.9, src/gspaint.c 1.8, src/gxdevcli.h 1.18]</p>
</blockquote>

<p><strong><a name="2003-09-08_1206"></a>
2003-09-08 12:06 Igor Melichev</strong> (<a href="Details.htm#2003-09-08_1206">details</a>)</p>
<blockquote>
<pre>
Fix : Cygwin/gcc compiler warnings.

</pre>
<p>[src/gdevpdfc.c 1.36, src/gxcldev.h 1.13, src/gxcpath.c 1.8, src/lib.mak 1.137, src/zbfont.c 1.24, src/ztrans.c 1.21]</p>
</blockquote>

<p><strong><a name="2003-09-08_1145"></a>
2003-09-08 11:45 Igor Melichev</strong> (<a href="Details.htm#2003-09-08_1145">details</a>)</p>
<blockquote>
<pre>
Defining a new device virtual function fill_rectangle_hl_color.
This fuction is used to implement gs_rectfill and gs_fillpage
with a high level color handling.

</pre>
<p>[src/gdevbbox.c 1.14, src/gdevdflt.c 1.12, src/gdevnfwd.c 1.10, src/gdevpdf.c 1.71, src/gdevpdfd.c 1.32, src/gdevpdfx.h 1.74, src/gdevrops.c 1.8, src/gsdps1.c 1.8, src/gspaint.c 1.7, src/gxclip.c 1.11, src/gxclip2.c 1.8, src/gxclipm.c 1.10, src/gxclist.c 1.11, src/gxdevcli.h 1.17, src/gxdevice.h 1.13, src/gxhldevc.c 1.3, src/gxhldevc.h 1.4, src/lib.mak 1.136]</p>
</blockquote>

<p><strong><a name="2003-09-05_2130"></a>
2003-09-05 21:30 Dan Coby</strong></p>
<blockquote>
<pre>
Add gxhldevc.c and gxhldevc.h to the file list.
</pre>
<p>[doc/Develop.htm 1.121]</p>
</blockquote>

<p><strong><a name="2003-09-04_1617"></a>
2003-09-04 16:17 Ralph Giles</strong></p>
<blockquote>
<pre>
VMS fix from Forrest Cahoon.
</pre>
<p>[src/gp_vms.c 1.35]</p>
</blockquote>

<p><strong><a name="2003-09-04_1451"></a>
2003-09-04 14:51 Igor Melichev</strong> (<a href="Details.htm#2003-09-04_1451">details</a>)</p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 5).

</pre>
<p>[src/gxtype1.c 1.31]</p>
</blockquote>

<p><strong><a name="2003-09-04_1431"></a>
2003-09-04 14:31 Igor Melichev</strong></p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 4).
</pre>
<p>[src/gxop1.h 1.7]</p>
</blockquote>

<p><strong><a name="2003-09-04_1428"></a>
2003-09-04 14:28 Igor Melichev</strong> (<a href="Details.htm#2003-09-04_1428">details</a>)</p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 3).

</pre>
<p>[src/gdevpsfx.c 1.24, src/gstype1.c 1.28, src/gstype2.c 1.31, src/gxop1.h 1.6, src/gxtype1.c 1.30, src/gxtype1.h 1.17, src/lib.mak 1.135]</p>
</blockquote>

<p><strong><a name="2003-09-04_1210"></a>
2003-09-04 12:10 Igor Melichev</strong> (<a href="Details.htm#2003-09-04_1210">details</a>)</p>
<blockquote>
<pre>
Fix : Removing obsolete linker statements from Win32 linkage definitions (an addition 2).

</pre>
<p>[src/dwsetup.def 1.4, src/dwuninst.def 1.4, src/msvc32.mak 1.49]</p>
</blockquote>

<p><strong><a name="2003-09-04_1130"></a>
2003-09-04 11:30 Igor Melichev</strong> (<a href="Details.htm#2003-09-04_1130">details</a>)</p>
<blockquote>
<pre>
Fix (the new type 1 hinter) : Slightly sloped stems were wrongly grid-fitted.

</pre>
<p>[src/gxhintn.c 1.32]</p>
</blockquote>

<p><strong><a name="2003-09-04_0952"></a>
2003-09-04 09:52 Jouk Jansen</strong></p>
<blockquote>
<pre>

 Committing in .

 OpenVMS patches

 Modified Files:
 	gs/src/gp_vms.c gs/src/openvms.mmk gs/src/vms_x_fix.h
 ----------------------------------------------------------------------
</pre>
<p>[src/gp_vms.c 1.34, src/openvms.mmk 1.26, src/vms_x_fix.h 1.7]</p>
</blockquote>

<p><strong><a name="2003-09-03_2031"></a>
2003-09-03 20:31 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix : Removing obsolete linker statements from Win32 linkage definitions (an addition).
</pre>
<p>[src/dwsetup.def 1.3, src/dwuninst.def 1.3, src/msvc32.mak 1.48]</p>
</blockquote>

<p><strong><a name="2003-09-03_2027"></a>
2003-09-03 20:27 Igor Melichev</strong></p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 3, final).
</pre>
<p>[src/gxhint1.c 1.7, src/gxhint2.c 1.8, src/gxhint3.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-09-03_2021"></a>
2003-09-03 20:21 Igor Melichev</strong> (<a href="Details.htm#2003-09-03_2021">details</a>)</p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 2).

</pre>
<p>[src/gstype2.c 1.30, src/gxtype1.c 1.29, src/gxtype1.h 1.16, src/lib.mak 1.134]</p>
</blockquote>

<p><strong><a name="2003-09-03_1620"></a>
2003-09-03 16:20 Jack Moffitt</strong></p>
<blockquote>
<pre>
Make run_nightly retry sending mail every 5 seconds.
</pre>
<p>[toolbin/tests/run_nightly 1.20]</p>
</blockquote>

<p><strong><a name="2003-09-03_0322"></a>
2003-09-03 03:22 Ralph Giles</strong></p>
<blockquote>
<pre>
Rename the client header errors.h to ierrors.h. This is more consistent
with iapi.h, and reduces the risk of a namespace conflict. The old
errors.h header is still available, and simply includes ierrors.h
for compatibility. This file is marked as deprecated and will be removed
in a future release.

This change is in response to a spurious report of a namespace conflict on MacOS in bug 686966.
</pre>
<p>[doc/API.htm 1.37, doc/C-style.htm 1.44, doc/Develop.htm 1.120, src/dmmain.c 1.2, src/dpmain.c 1.9, src/dwmain.c 1.13, src/dwmainc.c 1.15, src/dxmain.c 1.11, src/dxmainc.c 1.8, src/errors.h 1.8, src/fapi_ft.c 1.11, src/fapiufst.c 1.23, src/gs.c 1.11, src/gsdll.c 1.10, src/gsiomacres.c 1.5, src/ialloc.c 1.6, src/iapi.c 1.9, src/iapi.h 1.12, src/ibnum.c 1.7, src/iccfont.c 1.8, src/icontext.c 1.16, src/idict.c 1.8, src/idparam.c 1.8, src/ierrors.h 1.1, src/igc.c 1.10, src/igstate.h 1.8, src/iinit.c 1.9, src/ilocate.c 1.9, src/imain.c 1.33, src/imainarg.c 1.31, src/iname.c 1.7, src/inobtokn.c 1.5, src/int.mak 1.115, src/interp.c 1.15, src/iparam.c 1.9, src/iplugin.c 1.4, src/ireclaim.c 1.7, src/isave.c 1.8, src/iscan.c 1.14, src/iscanbin.c 1.13, src/iscannum.c 1.7, src/istack.c 1.6, src/iutil.c 1.9, src/iutil2.c 1.6, src/macos-fw.mak 1.7, src/opcheck.h 1.6, src/oper.h 1.6, src/os2.mak 1.34, src/zcid.c 1.8, src/zfile1.c 1.11, src/ziodev.c 1.13]</p>
</blockquote>

<p><strong><a name="2003-09-02_2250"></a>
2003-09-02 22:50 Igor Melichev</strong> (<a href="Details.htm#2003-09-02_2250">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Implementing a high level color handling (a 3d improvement).

</pre>
<p>[src/gdevpdfc.c 1.35]</p>
</blockquote>

<p><strong><a name="2003-09-02_2157"></a>
2003-09-02 21:57 Igor Melichev</strong> (<a href="Details.htm#2003-09-02_2157">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Implementing a high level color handling (a 2nd improvement).

</pre>
<p>[src/gdevpdfg.c 1.39]</p>
</blockquote>

<p><strong><a name="2003-09-02_1910"></a>
2003-09-02 19:10 Ralph Giles</strong></p>
<blockquote>
<pre>
Propagate CFLAGS and LDFLAGS values set in the environment when configure
is run to the autoconf top-level makefile. Unlike passing the same values
to make, the values are added to the generated arguments and act supplementally.
Closes bug 686943.
</pre>
<p>[src/Makefile.in 1.27]</p>
</blockquote>

<p><strong><a name="2003-09-02_1547"></a>
2003-09-02 15:47 Igor Melichev</strong> (<a href="Details.htm#2003-09-02_1547">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Implementing a high level color handling (an improvement).

</pre>
<p>[src/gdevpdfc.c 1.34, src/gdevpdfg.c 1.38]</p>
</blockquote>

<p><strong><a name="2003-09-02_1017"></a>
2003-09-02 10:17 Igor Melichev</strong> (<a href="Details.htm#2003-09-02_1017">details</a>)</p>
<blockquote>
<pre>
Removing rudiments of the old hinter (step 1).

</pre>
<p>[src/gdevpsfx.c 1.23, src/gstype1.c 1.27, src/gstype2.c 1.29, src/gxhint1.c 1.6, src/gxhint2.c 1.7, src/gxhint3.c 1.8, src/gxhintn.c 1.31, src/gxhintn.h 1.14, src/gxtype1.c 1.28, src/gxtype1.h 1.15]</p>
</blockquote>

<p><strong><a name="2003-08-30_2218"></a>
2003-08-30 22:18 Ralph Giles</strong></p>
<blockquote>
<pre>
Add 'extern "C"' protection to iapi.h for inclusion in C++ clients. Closes
bug 686990.
</pre>
<p>[src/iapi.h 1.11]</p>
</blockquote>

<p><strong><a name="2003-08-30_1910"></a>
2003-08-30 19:10 Dan Coby</strong> (<a href="Details.htm#2003-08-30_1910">details</a>)</p>
<blockquote>
<pre>
Fix for 686948 Dotted lines messing in PDF.  Draw all line cap
types for zero line lengths.  Previously only rounded caps were
drawn.

</pre>
<p>[src/gxstroke.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-08-30_0803"></a>
2003-08-30 08:03 jeong</strong></p>
<blockquote>
<pre>
When a PDF file has an embedded TrueType font with wrong 'name' table
entry, /findname procedure in gs_ttf.ps throwed a rangecheck error.
Now it just returns 'false' as an output instead of making rangecheck
error.
Bug# 686903.
</pre>
<p>[lib/gs_ttf.ps 1.32]</p>
</blockquote>

<p><strong><a name="2003-08-28_1942"></a>
2003-08-28 19:42 Igor Melichev</strong> (<a href="Details.htm#2003-08-28_1942">details</a>)</p>
<blockquote>
<pre>
pdfwrite : Implementing a high level color handling.

</pre>
<p>[src/devs.mak 1.95, src/gdevpdfc.c 1.33, src/gdevpdfd.c 1.31, src/gdevpdfg.c 1.37, src/gdevpdfg.h 1.24, src/gdevpdfv.c 1.29, src/gdevpdtw.c 1.25, src/gdevpsdf.h 1.20, src/gdevpsdu.c 1.20, src/gxhldevc.c 1.2, src/gxhldevc.h 1.3]</p>
</blockquote>

<p><strong><a name="2003-08-28_1018"></a>
2003-08-28 10:18 Igor Melichev</strong></p>
<blockquote>
<pre>
Fix : Removing obsolete linker statements from Win32 likage definitions.
</pre>
<p>[src/dw32c.def 1.3, src/dwmain32.def 1.3, src/gsdll32.def 1.4]</p>
</blockquote>

<p><strong><a name="2003-08-26_2108"></a>
2003-08-26 21:08 Igor Melichev</strong></p>
<blockquote>
<pre>
Fixing all MSVC compiler warnings (icclib).
</pre>
<p>[icclib/icc.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-08-26_2054"></a>
2003-08-26 20:54 Igor Melichev</strong></p>
<blockquote>
<pre>
Fixing all MSVC compiler warnings (Release build).
</pre>
<p>[src/gxclipm.c 1.9]</p>
</blockquote>

<p><strong><a name="2003-08-26_1538"></a>
2003-08-26 15:38 Igor Melichev</strong></p>
<blockquote>
<pre>
Fixing all MSVC compiler warnings.
</pre>
<p>[src/gdevpsdu.c 1.19, src/gdevupd.c 1.13, src/gsciemap.c 1.15, src/gswts.c 1.5, src/gxclrect.c 1.6, src/gxdda.h 1.5, src/gxshade.c 1.17, src/gxstroke.c 1.8, src/sdcparam.c 1.6]</p>
</blockquote>

<p><strong><a name="2003-08-26_1237"></a>
2003-08-26 12:37 Igor Melichev</strong> (<a href="Details.htm#2003-08-26_1237">details</a>)</p>
<blockquote>
<pre>
A preparation for high level color handling in vector devices.

THIS IS INCOMPATIBLE CHANGE for devices derived from gx_device_vector.
Now they must implement the new virtual function can_handle_hl_color.
A simplest impementation compatible to the old behavior is to return false.

</pre>
<p>[src/gdevpdfd.c 1.30, src/gdevpdfg.c 1.36, src/gdevpdfg.h 1.23, src/gdevpdfx.h 1.73, src/gdevpdtt.c 1.56, src/gdevps.c 1.36, src/gdevpsdf.h 1.19, src/gdevpsdu.c 1.18, src/gdevpx.c 1.14, src/gdevvec.c 1.20, src/gdevvec.h 1.12, src/gsdcolor.h 1.12, src/gxdcolor.c 1.12, src/gxhldevc.h 1.2, src/lib.mak 1.133]</p>
</blockquote>

<p><strong><a name="2003-08-21_1950"></a>
2003-08-21 19:50 Raph Levien</strong> (<a href="Details.htm#2003-08-21_1950">details</a>)</p>
<blockquote>
<pre>
Fix decimal value of NoView annotation flag in annotvisible logic.
Fixes bug #687010.

</pre>
<p>[lib/pdf_draw.ps 1.74]</p>
</blockquote>

<p><strong><a name="2003-08-21_1718"></a>
2003-08-21 17:18 Raph Levien</strong></p>
<blockquote>
<pre>
Re-enable tempfile creation with empty string prefix - was disabled
as part of tempfile prefix_is_simple checking patch.
</pre>
<p>[src/zfile.c 1.38]</p>
</blockquote>

<p><strong><a name="2003-08-21_1455"></a>
2003-08-21 14:55 Igor Melichev</strong></p>
<blockquote>
<pre>
Fixing some Cygwin/gcc warnings.
</pre>
<p>[src/gdevdgbr.c 1.10, src/gdevepsc.c 1.10, src/gdevmrun.c 1.5, src/gdevpdtw.c 1.24, src/gspath.c 1.8, src/gstype1.c 1.26, src/gstype1.h 1.8, src/gxcmap.c 1.16, src/gxcpath.c 1.7, src/gxhintn.c 1.30, src/gxpath.h 1.8, src/gzacpath.h 1.6, src/ifont2.h 1.6]</p>
</blockquote>

<p><strong><a name="2003-08-21_1425"></a>
2003-08-21 14:25 Igor Melichev</strong> (<a href="Details.htm#2003-08-21_1425">details</a>)</p>
<blockquote>
<pre>
Removing the obsolete code DROPOUT_PREVENTION 0.

</pre>
<p>[src/gdevddrw.c 1.8, src/gdevddrw.h 1.3, src/gx.h 1.12, src/gxccache.c 1.18, src/gxchar.c 1.31, src/gxfill.c 1.39, src/gxpcopy.c 1.9, src/gxpflat.c 1.6, src/zchar42.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-08-21_1347"></a>
2003-08-21 13:47 Igor Melichev</strong> (<a href="Details.htm#2003-08-21_1347">details</a>)</p>
<blockquote>
<pre>
Removing the obsolete code NEW_TYPE1_HINTER 0 from the character renderer.

</pre>
<p>[src/gstype1.c 1.25, src/gstype2.c 1.28, src/gx.h 1.11, src/gxtype1.c 1.27, src/gxtype1.h 1.14]</p>
</blockquote>

<p><strong><a name="2003-08-20_1953"></a>
2003-08-20 19:53 Igor Melichev</strong></p>
<blockquote>
<pre>
Removing the obsolete code PATTERN_STREAM_ACCUMULATION 0 .
</pre>
<p>[src/gdevpdf.c 1.70, src/gdevpdfi.c 1.49, src/gdevpdfm.c 1.32, src/gdevpdfv.c 1.28, src/gdevpdfx.h 1.72, src/gdevpdti.c 1.19, src/gsptype1.c 1.17, src/gx.h 1.10, src/gxpcmap.c 1.10, src/gxpcolor.h 1.9, src/zpcolor.c 1.11]</p>
</blockquote>

<p><strong><a name="2003-08-20_1758"></a>
2003-08-20 17:58 Igor Melichev</strong></p>
<blockquote>
<pre>
Removing the obsolete code NEW_COMBINE_PATH 0 .
</pre>
<p>[src/gp_dosfs.c 1.15, src/gp_iwatc.c 1.16, src/gp_macio.c 1.31, src/gp_ntfs.c 1.20, src/gp.h 1.26, src/gp_os2.c 1.29, src/gp_unifn.c 1.14, src/gp_unifs.c 1.14, src/gp_vms.c 1.33, src/icontext.c 1.15, src/icstate.h 1.12, src/imainarg.c 1.30, src/zfile.c 1.37, src/zfile1.c 1.10, lib/gs_ciddc.ps 1.12, lib/gs_fonts.ps 1.42, lib/gs_init.ps 1.95, lib/gs_res.ps 1.35]</p>
</blockquote>

<p><strong><a name="2003-08-19_2020"></a>
2003-08-19 20:20 Alex Cherepanov</strong></p>
<blockquote>
<pre>
Cygwin wants X11 libraries in the order Xt SM ICE Xext X11 but autoconf
generated them in the order SM ICE Xt Xext X11. Restore pre-autoconf order.
</pre>
<p>[src/configure.ac 1.33]</p>
</blockquote>

<p><strong><a name="2003-08-18_2338"></a>
2003-08-18 23:38 Ralph Giles</strong></p>
<blockquote>
<pre>
Raise the limit on interpreter memory to 1GB for regression testing. This
larger value is required to process the ai2.pdf test file with pdfwrite
at the default (720 dpi) resolution.
</pre>
<p>[toolbin/tests/gstestgs.py 1.21]</p>
</blockquote>

<p><strong><a name="2003-08-18_2121"></a>
2003-08-18 21:21 Dan Coby</strong></p>
<blockquote>
<pre>
This commit is part of extending support for high level colors to
high level devices.  In general, additions have been made to the
device colors to include the high level color values used to create
the device color.  A flag was also added to indicate if the color
information (in dev_color->ccolor) is valid.  There are also two
files being added to provide support for saving and comparing the
high level color information.
</pre>
<p>[src/devs.mak 1.94, src/gdevbbox.c 1.13, src/gdevdbit.c 1.9, src/gdevpdfb.c 1.19, src/gdevpdfd.c 1.29, src/gdevpdfg.c 1.35, src/gdevpdfi.c 1.48, src/gdevpdfv.c 1.27, src/gdevpdtt.c 1.55, src/gdevplnx.c 1.6, src/gdevps.c 1.35, src/gdevpx.c 1.13, src/gdevvec.c 1.19, src/gsciemap.c 1.14, src/gscolor.c 1.11, src/gscsepr.c 1.21, src/gsdcolor.h 1.11, src/gslib.c 1.12, src/gspcolor.c 1.10, src/gsptype2.c 1.13, src/gsptype2.h 1.8, src/gxacpath.c 1.9, src/gxcmap.c 1.15, src/gxdcolor.c 1.11, src/gxhldevc.c 1.1, src/gxhldevc.h 1.1, src/gxi12bit.c 1.6, src/gxicolor.c 1.9, src/gxifast.c 1.9, src/gximage3.c 1.12, src/gxipixel.c 1.9, src/gxpcmap.c 1.9, src/lib.mak 1.132]</p>
</blockquote>

<p><strong><a name="2003-08-18_2043"></a>
2003-08-18 20:43 Dan Coby</strong> (<a href="Details.htm#2003-08-18_2043">details</a>)</p>
<blockquote>
<pre>
Fix for 686998 syntax error in findxref for customer 580.  The given
test file does not have 'startxref' on its own line.  This is a
violation of the PDF spec.  However Adobe Acrobat accepts the file.
This fix adds a check for this case and prints a warning message.
File processing then continues.

</pre>
<p>[lib/pdf_main.ps 1.77, lib/pdf_rbld.ps 1.4]</p>
</blockquote>

<p><strong><a name="2003-08-18_2033"></a>
2003-08-18 20:33 Raph Levien</strong></p>
<blockquote>
<pre>
The invocation "./configure; make install" wasn't working because
the install target doesn't create the "standard directories", in
particular obj/. This patch simply adds the STDDIRS dependency to
the install-exec target, parallel to the existing std target, which
is the default chosen from a simple "make" invocation.
</pre>
<p>[src/unixinst.mak 1.32]</p>
</blockquote>

<p><strong><a name="2003-08-18_2030"></a>
2003-08-18 20:30 Ray Johnston</strong></p>
<blockquote>
<pre>
Fix non-conformance of "startjob" if password check fails. Previously, the
"quit" operator in systemdict was masked by a definition of /quit as /stop
in userdict, even if startjob failed due to password check or other reason.
</pre>
<p>[lib/gs_lev2.ps 1.30]</p>
</blockquote>

<p><strong><a name="2003-08-18_1702"></a>
2003-08-18 17:02 Ralph Giles</strong></p>
<blockquote>
<pre>
Bump the version number post-release.
</pre>
<p>[doc/News.htm 1.136, lib/gs_init.ps 1.94, src/gscdef.c 1.38, src/version.mak 1.66]</p>
</blockquote>

<p><strong><a name="2003-08-18_0150"></a>
2003-08-18 01:50 Ralph Giles</strong></p>
<blockquote>
<pre>
Protect a Carbon-only call in the MacOS code. This was preventing linking
in the Classic shlib build.
</pre>
<p>[src/gp_macio.c 1.30]</p>
</blockquote>

<p><strong><a name="2003-08-17_1741"></a>
2003-08-17 17:41 Ray Johnston</strong></p>
<blockquote>
<pre>
Add some more CMap files that have been encountered in files recently
submitted as bugs. Newer versions of some of the ETen CMap group are also
provided.
</pre>
<p>[Resource/CMap/ETHK-B5-H 1.1, Resource/CMap/ETHK-B5-V 1.1, Resource/CMap/ETen-B5-H 1.2, Resource/CMap/ETen-B5-UCS2 1.1, Resource/CMap/ETen-B5-V 1.2, Resource/CMap/ETenms-B5-H 1.1, Resource/CMap/ETenms-B5-V 1.1]</p>
</blockquote>

<p><strong><a name="2003-08-17_1052"></a>
2003-08-17 10:52 Russell Lang</strong></p>
<blockquote>
<pre>
Add the jbig2dec source directory to the Windows Release instructions.
</pre>
<p>[doc/Release.htm 1.81]</p>
</blockquote>
</body>
</html>
                                                                                                                 "23έ	 "˝QW"ʪɺ1"4&                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Conditions to distribute Ghostscript in a commercial context</title>
<!-- $Id: Commprod.htm,v 1.30 2003/12/08 23:17:14 giles Exp $ -->
<!-- Originally: commprod.txt -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1>Conditions on distributing Ghostscript in a commercial context</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.2 begin table of contents] ========================================= -->

<h2>Table of contents</h2>

<ul>
<li><a href="#Free_version">The use of the public-access "free" version of Ghostscript</a>
<li><a href="#GPL">The GNU General Public License (GPL)</a>
</ul>

<!-- [1.2 end table of contents] =========================================== -->

<!-- [1.3 begin hint] ====================================================== -->

<p>
This document sets forth the conditions under which Ghostscript may be
distributed in a commercial context: under a written license from <a
href="#Artifex">Artifex Software</a> Inc., the copyright holder's exclusive
commercial licensing partner, or under certain other very limited
conditions.

<p>For other information, see the <a href="Readme.htm">Ghostscript
overview</a>.

<!-- [1.3 end hint] ======================================================== -->

<!-- [1.0 end visible header] ============================================== -->

<hr>

<!-- [2.0 begin contents] ================================================== -->

<h2><a name="Free_version"></a>Use of the public-access "free"
version of Ghostscript</h2>

<p>
Ghostscript is a copyrighted work whose copyright is owned by artofcode LLC.
Some versions of Ghostscript are distributed freely under the name AFPL
Ghostscript or (for older versions) Aladdin Ghostscript; these versions are
always distributed with a license, called the <a href="Public.htm">Aladdin
Free Public License</a> (also known as the AFPL), which permits redistribution
under certain conditions.  These
conditions will almost always be met easily by individuals in their personal
use of AFPL Ghostscript.  AFPL Ghostscript may be <em>used</em> freely,
including by commercial entities for evaluation or unsupported internal use.
However, <em>distribution</em> for commercial purposes of Ghostscript, or
anything containing or derived from Ghostscript in whole or in part,
generally requires a written commercial license from <a
href="#Artifex">Artifex Software Inc.</a>, the sole entity authorized by the
copyright holder to grant such licenses.  More specifically, the AFPL
states:

<blockquote>
Distribution of the Program or any work based on the Program by a
commercial organization to any third party is prohibited if any payment is
made in connection with such distribution, whether directly (as in payment
for a copy of the Program) or indirectly (as in payment for some service
related to the Program, or payment for some product or service that
includes a copy of the Program "without charge"; these are only examples,
and not an exhaustive enumeration of prohibited activities).  However, the
following methods of distribution involving payment shall not in and of
themselves be a violation of this restriction:

<dl compact>
<dt>(i)<dd>Posting the Program on a public access information storage and
retrieval service for which a fee is received for retrieving information
(such as an on-line service), provided that the fee is not
content-dependent (i.e., the fee would be the same for retrieving the same
volume of information consisting of random data).

<dt>(ii)<dd>Distributing the Program on a CD-ROM, provided that the files
containing the Program are reproduced entirely and verbatim on such CD-ROM,
and provided further that all information on such CD-ROM be redistributable
for non-commercial purposes without charge.
</dl>
</blockquote>

<p>
The intent of the exception provided in clause (i) is to allow commercial
organizations operating an FTP server or a bulletin board to distribute
AFPL Ghostscript freely from it, provided that:

<dl compact>
<dt>(1)<dd>the organization complies with the other provisions of the
AFPL, which include among other things a requirement to distribute the
full source code of AFPL Ghostscript and of any derived work, and to
distribute the AFPL itself along with AFPL Ghostscript;

<dt>(2)<dd>the only charge for downloading AFPL Ghostscript is a charge
based on the distribution service and not one based on the content of the
information being retrieved (i.e., the charge would be the same for
retrieving a random collection of bits of the same size);

<dt>(3)<dd>the server or BBS is accessible to the general public, i.e.,
the phone number or IP address is not kept secret, and anyone may obtain
access to the information (possibly by paying a subscription or access fee
that is not dependent on or related to purchasing anything else).
</dl>

<p>
Similarly, the exception in clause (ii) is intended to allow inclusion of
AFPL Ghostscript on "freeware" CD-ROMs that contain only material that
is in the public domain, or is freely redistributable provided only that a
copyright notice is retained (such as the Independent JPEG Group
libraries), or is distributed under some other kind of license allowing
free redistribution such as the GNU
<a href="http://www.gnu.org/copyleft/gpl.html">General Public License</a>.

<p>
If you want to distribute software in a commercial context that
incorporates Ghostscript and you do <em>not</em> want to meet these
conditions, you should contact <a href="#Artifex">Artifex Software</a> to
find out about commercial licensing.  Commercial licenses involve a
(negotiated) payment, and includes support and other benefits.  These are
the only ways you legally can distribute AFPL Ghostscript or anything containing
AFPL Ghostscript: either by distributing Ghostscript under the
requirements of the AFPL, or by getting a commercial license from Artifex
Software.

<p>
<a name="Artifex"></a>For commercial licensing, please contact:

<blockquote><address>
Licensing Information<br>
Artifex Software Inc.<br>
454 Las Gallinas Ave., suite 108<br>
San Rafael, CA 94903  U.S.A.<br>
+1-415-492-9861 telephone<br>
+1-415-492-9862 fax<br>
<a href="mailto:info@artifex.com">info@artifex.com</a><br>
<a href="http://www.artifex.com/">http://www.artifex.com/</a>
</address></blockquote>

<p>
If you have questions about the information in this document, please
contact:

<blockquote><address>
artofcode LLC<br>
940 Tyler St. Studio 6<br>
Benicia CA 94510  U.S.A.<br>
+1-707-746-6398 fax<br>
<a href="mailto:raph@artofcode.com">raph@artofcode.com</a><br>
<a href="http://www.ghostscript.com/">http://www.ghostscript.com/</a>
</address></blockquote>

<h2><a name="GPL"></a>The GNU General Public License (GPL)</h2>

<p>
Older versions of Ghostscript (usually the previous major release of AFPL Ghostscript)
are distributed with a license called the GNU
<a href="http://www.gnu.org/copyleft/gpl.html">General Public License</a>
(also known as the "GNU License", the "GPL", or "copyleft"), which is similar
to the AFPL in requiring source disclosure, but also
allows distribution with commercial products under certain conditions.
These versions are identified as "GPL Ghostscript" or
"GNU Ghostscript."  The remainder of this section applies only to versions
identified explicitly as GPL or GNU Ghostscript versions; the generic name
Ghostscript, when applied to versions above 4.03, refers to AFPL
Ghostscript, which is governed by the Aladdin Free Public License, not the
GPL.

<p>
The full GPL is included under the name
<b><tt>COPYING</tt></b> in the GNU Ghostscript fileset, and
can also be obtained directly from the Free Software Foundation:

<blockquote><address><a name="FSF_address"></a>
Free Software Foundation, Inc. (FSF)<br>
59 Temple Place, Suite 330<br>
Boston, MA 02111-1307 U.S.A.<br>
+1-617-542-5942 telephone<br>
+1-617-542-2652 fax (including Japan):<br>
<a href="mailto:gnu@gnu.org">gnu@gnu.org</a><br>
<a href="http://www.gnu.org/">http://www.gnu.org/</a>
</address></blockquote>

<p>
The GPL gotten directly from the FSF or the contents of the
<b><tt>COPYING</tt></b> file are authoritative, but for those
unfamiliar with the GPL, we now summarize its provisions.

<dl compact>
<dt>1.<dd>Anyone may copy and distribute GNU Ghostscript (both source and
object code), but they must distribute the source code as well as the
object code (or, if they distribute only the object code, they must
include an offer in writing to provide the source code at no more than
reproduction cost), keep all copyright and other notices, and include the
GPL with the copies.  (Note that this allows anyone receiving such a copy
to distribute it freely as well.)

<dt>2.<dd>Anyone may modify GNU Ghostscript, but the provisions of (1)
apply to modified or derived works as well.

<dt>3.<dd>GNU Ghostscript may be "aggregated" with another program; in
this case, (1) and (2) do not apply to the other program, but only to GNU
Ghostscript.
</dl>

<p>
Provision (2) effectively prevents the development of proprietary commercial 
products that incorporate GNU Ghostscript without a commercial license as a part, since
these are "derived works" in the legal sense.

<p>
Questions have arisen at times in particular cases regarding provision (3)
as to whether GNU Ghostscript is "aggregated" with other parts of a
commercial product, or whether the product has become a "derived work."
Normally, combining GNU Ghostscript with another piece of software creates
a "derived work"; we consider GNU Ghostscript to be "aggregated" with
another piece of software, which we will refer to as "the application",
only if all of the following conditions are met:

<ul>
<li> The code and documentation for GNU Ghostscript are physically
separated from the code and documentation for the application. For
electronic form, it is both necessary and sufficient to put the GNU
Ghostscript code and documentation in their own directory tree(s).

<li> GNU Ghostscript, as delivered with the application, is usable
independently of the application.  More precisely, if a user deletes from
the computer system all files delivered with the application except those
in the GNU Ghostscript directories, the user will still be able to use GNU
Ghostscript as described in GNU Ghostscript's documentation.  Among other
things, this requires that GNU Ghostscript not call any routines in the
application, and not require any data or other files supplied as part of
the application.

<li> The application calls GNU Ghostscript in a way that allows an ordinary
user to substitute another program for GNU Ghostscript.  (Typically this
requires use of a shell script or batch file, or a system call like
"<b><tt>exec</tt></b>".)  More precisely, if the user deletes from the
computer system all the files in the GNU Ghostscript directories, and
replaces the GNU Ghostscript executable with another program with the same
name and conforming to the same documentation, the application will
continue to work with it.  One implication of this is that the GNU
Ghostscript documentation must specify all properties of GNU Ghostscript on
which the application relies; for example, if GNU Ghostscript has been
modified by the addition of command line switches or language elements such
as new operators, the documentation must describe any such additions that
the application uses.

<li> The conditions of the GPL are met with respect to GNU Ghostscript,
including the requirement for propagation of the GPL and the requirement
for delivering (or an offer to deliver) source code.
</ul>

<p>
Regarding this last point, the GPL clearly intends that if the distributor
only offers to provide the GNU Ghostscript source code (as opposed to
actually distributing the source code with every copy of the application),
then they must deliver the source code in a timely way to anyone
requesting it.

<p>
The GPL makes it clear that if someone receives GNU Ghostscript only in
its GPL-licensed form, they only have a right to distribute it if they
comply with the GPL.  artofcode LLC, as the copyright holder, takes
this requirement very seriously, and will, if necessary, take legal action
to ensure that anyone distributing GNU Ghostscript with the GPL complies
with the conditions set forth above.

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>

<p>
<small>Copyright &copy; 1996-2002 artofcode LLC. All rights reserved.</small>

<p>
<small>This file is part of AFPL Ghostscript.  See the <a
href="Public.htm">Aladdin Free Public License</a> (the "License") for full
details of the terms of using, copying, modifying, and redistributing AFPL
Ghostscript.</small>

<p>
<small>Ghostscript version 8.12, 8 December 2003


<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
 '     '                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Not the Gnu General Public License</title>
<!-- $Id: Copying.htm,v 1.29 2003/12/08 23:17:15 giles Exp $ -->
<!-- Originally: COPYING -->
<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
</head>

<body>
<!-- [1.0 begin visible header] ============================================ -->

<!-- [1.1 begin headline] ================================================== -->

<h1><em>Not</em> the Gnu General Public License</h1>

<!-- [1.1 end headline] ==================================================== -->

<!-- [1.3 begin hint] ====================================================== -->

<p>For other information, see the <a href="Readme.htm">Ghostscript
overview</a>.

<!-- [1.3 end hint] ======================================================== -->

<hr>

<!-- [1.0 end visible header] ============================================== -->

<!-- [2.0 begin contents] ================================================== -->

<p>
Many versions of Ghostscript, including all versions created before June
1993, are customarily distributed with a license called the
<a href="http://www.gnu.org/copyleft/gpl.html" class="offsite">GNU
General Public
License</a> (GPL); in these versions, a file named <b><tt>COPYING</tt></b>
contains a copy of the license.  This copy of Ghostscript is governed not
by the GNU license, but by a substantially different license in a similar
spirit, the <a href="Public.htm">Aladdin Free Public License</a>.

<!-- [2.0 end contents] ==================================================== -->

<!-- [3.0 begin visible trailer] =========================================== -->
<hr>

<p>
<small>Copyright &copy; 1996, 1997, 1998 Aladdin Enterprises.
All rights reserved.</small>

<p>
This software is provided AS-IS with no warranty, either express or
implied.

This software is distributed under license and may not be copied,
modified or distributed except as expressly authorized under the terms
of the license contained in the file LICENSE in this distribution.

For more information about licensing, please refer to
http://www.ghostscript.com/licensing/. For information on
commercial licensing, go to http://www.artifex.com/licensing/ or
contact Artifex Software, Inc., 101 Lucas Valley Road #110,
San Rafael, CA  94903, U.S.A., +1(415)492-9861.

<p>
<small>Ghostscript version 8.12, 8 December 2003

<!-- [3.0 end visible trailer] ============================================= -->

</body>
</html>
rayscale monitors should work just fine.


4  Obtaining MacDim Modules

Several new MacDim modules are now available. Download them at the MacDim module page:

   http://www.ibrium.se/macdim/modules.html


5  Configuration of MacDim

There is a simple help system in MacDim. Point at any button or object to get some information about it on the bottom of the MacDim window. There are five features that can be activated / deactivated separately. Each feature is enabled by the small checkbox inside t